最近收到很多對資料庫查詢壓力過大的反饋,由於我的程式只是從資料庫讀取記錄,和進行緩衝;所以考慮通過延長應用程式內部的快取時間、增大快取量,使程式從快取中讀取資料,從而解決訪問資料庫過於頻繁的問題,從而降低資料庫讀取壓力。
程式中的快取資料使用stl中的map表儲存,快取的資料量比較大,單個物件占用50個位元組,快取個數約1百萬吧;且由於有定時的遍歷檢查任務,所以比較擔心遍歷的效能,於是進行了遍歷map表的效能測試。先測試了一下10萬次遍歷的效能,發現計算機速度快的超出想象,具體耗時如下:
10萬次除錯版本:329、343;10萬次發布版本:15、15;
耗時的時長單位為毫秒(ms),以下均為毫秒。看來對於發布版本的效能確實比除錯版本快很多呀,10萬次的遍歷測試對發布版本測試意義不大,下面測試一下百萬迴圈的耗時。描述一下本機的測試環境,dell膝上型電腦,cpu是intel迅馳1.73g、512m記憶體、winxp系統(sp2),以下是發布版本對幾種遍歷個數的測試結果:
100萬次:125、125、125、110、109、109;占用記憶體約130mb
200萬次:281、235、250、234、250、235;占用記憶體約96mb
500萬次:65563、64797、53437、63250、69230、70969;占用記憶體約240mb
當進行500萬次map表遍歷測試時,計算機的硬碟一直狂轉不止,通過任務管理器也可以看到程式,這時使用了大量的虛擬記憶體,估計這就是效能下降很多的原因吧。
對比上述幾種遍歷次數的測試,可以得到一些結論,一是一般的計算機(p4)支援百萬次的map表遍歷沒有什麼效能影響,估計200萬次下的都可以接受;二是如遍歷次數過多(500萬以上),效能會發生直線的下降,這種情況我們在程式設計的過程中應當避免;三是物理記憶體和虛擬記憶體相比,效能差距確實是非常之大,如果確實需要消耗比較大的記憶體,那我們就需要對計算機的記憶體進行擴容了。
聯想其他資料儲存型別,stl的list、hash_map、vector和mfc的clist、cmap、carray等容器儲存資料時,其遍歷性能應該不會比map表差吧。
js迴圈遍歷性能
定length for迴圈 有length 不定length for迴圈 使用陣列length 不定length for迴圈 判斷陣列length是否存在 foreach array自帶,對某些不適用例如 nodelist forof es6 mapforin 結論 普通for迴圈才是最優雅的 ps...
Vector遍歷性能對比
偶然發現,遍歷vector時,使用兩種看上去沒什麼差別的方法,效能上卻有很大的差異。include include class cpoint int vectorread 0 const cpoint arr,size t size return result int vectorread 1 co...
map 遍歷方法
最常規的一種遍歷方法,最常規就是最常用的,雖然不複雜,但很重要,這是我們最熟悉的,就不多說了!public static void work mapmap 利用keyset進行遍歷,它的優點在於可以根據你所想要的key值得到你想要的 values,更具靈活性!public static void w...