最佳化 C++/編寫高效程式碼/執行緒使用
外觀
在互動式應用程式中,每當您需要執行可能花費幾秒鐘以上的操作時,請將操作分配給一個優先順序低於正常的 worker 執行緒。
這樣,主執行緒就可以處理新的使用者命令,並且透過為 worker 執行緒分配更低的優先順序,使用者介面保持響應。
嚴格來說,本指南不會提高應用程式的速度,只會提高其響應能力。但是,使用者會認為這是一種速度的提高。
在多核系統中,如果您可以將 CPU 密集型操作拆分為多個執行緒,請使用與處理器核心數量一樣多的工作執行緒。
這樣,每個核心都可以處理一個工作執行緒。如果分配的工作執行緒多於核心數量,結果將是繁重的執行緒切換,從而降低執行速度。主執行緒不會影響操作速度,因為它大多處於非活動狀態。
此方法不適用於 I/O 繫結任務;排程所有等待同一磁碟的執行緒只會導致開銷。但一個執行緒可以在另一個執行緒從磁碟讀取時進行計算,因此在某些 I/O 繫結程式中,兩個執行緒可以執行有用的工作。類似地,兩個執行緒有時可以比一個執行緒更好地利用全雙工網路鏈路。
如果您正在開發單執行緒應用程式,請不要使用僅為多執行緒應用程式設計的庫。
用於使庫執行緒安全的技術可能會產生記憶體和時間開銷。如果您不使用執行緒,請避免支付它們的成本。
如果您正在開發庫,請正確處理多執行緒應用程式對其的使用,但也針對單執行緒應用程式對其的使用進行最佳化。
用於使庫執行緒安全的技術可能會產生記憶體和時間開銷。如果您的庫使用者不使用執行緒,請避免強迫您的使用者支付執行緒的成本。
僅當多個執行緒同時訪問相同資料,並且至少其中一個訪問是用於寫入時,才使用互斥原語。
互斥原語有開銷。
如果您確定在給定時間段內,沒有執行緒寫入某個記憶體區域,則無需同步對該區域的讀取訪問。