本節討論了一些提高應用程式效能的常用技術:選擇uo大小、快取、緩衝區、輪詢、併發和並行、非阻塞 jo 和處理器繫結。參考應用程式文件看看這些技術哪些在應用,看看有沒有應用程式其他的獨有特性。
選擇io尺寸
執行 io的開銷包括初始化緩衝區、系統呼叫、上下文切換、分配核心元資料、檢查程序許可權和限制、對映位址到裝置、執行核心和驅動**來執行io,以及,在最後釋放元資料和緩衝區s
「初始化開銷」對於小型和大型的io都是差不多的。從效率上來說,每次io傳輸的資料越多,效率越高。
快取作業系統用快取提高檔案系統的讀效能和記憶體的分配效能,應用程式使用快取也出於類似的原因。將經常執行的操作的結果儲存在本地快取中以備後用,而非總是執行開銷較高的操作、資料庫緩衝區快取記憶體就是一例,該快取會儲存經常執行的資料庫查詢結果。
部署應用程式時,乙個常見的操作就是決定用什麼樣的快取,或能啟用什麼樣的快取,然後配置適合系統的快取尺寸。
快取乙個重要的方面就是如何保證完整性,確保查詢不會返回過期的資料。這稱為快取致性(cache coherency),而且執行的代價不低理想情況下,不要高於快取所帶來的益處
快取提高了讀操作效能,儲存通常用緩衝區來提高寫操作的效能
緩衝區為了提高寫操作效能,資料在送人下一層級之前會合併放在緩衝區中。這增加了io大小提公升了操作的效率。取決於寫操作的型別,這樣做可能會增加寫延時,因為第一次寫人緩衝區後,在傳送之前,還要等待後續的寫人
環形緩衝區(或迴圈緩衝區)是一類用於元件之間連續資料傳輸的大小固定的緩衝區,緩衝區的操作是非同步的。該型別緩衝可以用頭指標和尾指標來實現,指標隨著資料的增加或移出而改變位置
輪詢輪詢是系統等待某一事件發生的技術,該技術在迴圈中檢查事件狀態,兩次檢查之間有停頓。輪詢有一些潛在的效能問題:
這是效能問題,應用程式應能改變自身行為來監聽事件發生,當事件發生時立即通知應用程式並執行相應的例程
poll系統呼叫
有系統呼叫po11()來檢查檔案描述符的狀態,提供與輪詢相似的功能,不過它是基於事件的,因此沒有輪詢那樣的效能負擔
poll()介面支援多個檔案描述符作為乙個陣列,當事件發生要找到相應的檔案描述符時需要應用程式掃瞄這個陣列。這個掃瞄是o(n)(參見5.1.4節中的介紹),擴充套件時可能會變成個效能間題:在linux裡是epoll(),epoll()避免了這種掃瞄,複雜度是o(1)。基於solaris的系統有乙個相似的特性叫作事件埠 (eventponts),用port_get(3c)代替了po11()。
併發與並行
非阻塞io
處理器繫結
C 應用程式效能優化
本文選自c 應用程式效能優化 第2版 一書 總 序 去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了 變平了,中國作為地球村的一員,正以驚人的速度發展變化著。世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在乙個越來越小 越來越平的世...
C 應用程式效能優化
本文選自一書 總 序 去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了 變平了,中國作為地球村的一員,正以驚人的速度發展變化著。世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在乙個越來越小 越來越平的世界裡,中國會面對怎樣的挑戰和機...
WPF 應用程式效能優化
開發效率 能使用xaml實現的就不使用者cs後台程式編寫 資料繫結 資料繫結使用的是屬性,不是字段 public observablecollectionlist new observablecollection dispatcher.invoke dispatcherpriority.backgr...