最佳化 C++/程式碼最佳化/執行時支援
C++ 執行時支援例程顯然有相當大的成本,因為否則這種行為將被內聯。此處介紹了避免導致隱式呼叫代價高昂的執行時支援例程的語言特性的技巧。
不要使用 typeid 運算子,請使用 virtual 函式。
該運算子可能比虛擬函式呼叫花費更多時間。
不要使用 dynamic_cast 運算子,請使用 typeid 運算子,或者更優地,使用 virtual 函式呼叫。
該運算子可能比虛擬函式呼叫花費明顯更多的時間,也比 typeid 運算子花費更多時間。
對於你確信永遠不會丟擲異常的函式,請使用空異常說明(即在宣告末尾追加 throw())。
在 C++11 中,請改用 noexcept。
一些編譯器會使用此資訊來簡化處理異常所需的簿記工作。
對於每個瓶頸,請將 try 關鍵字移到瓶頸之前,並將匹配的 catch 子句移到瓶頸之後。
換句話說,將 try/catch 語句從瓶頸中提升出來。
try/catch 語句的執行有時是免費的,但有時會導致速度減慢。避免在瓶頸內重複執行此程式碼塊。
如果目標處理器不包含浮點單元,請將浮點函式、常量和變數替換為相應的整數函式、常量和變數;如果目標處理器僅包含單精度浮點單元,請將 double 函式、常量和變數替換為其 float 對應項。
目前的桌上型電腦或伺服器計算機處理器包含用於單精度和雙精度浮點運算的專用硬體,因此此類操作的速度幾乎與相應的整數操作一樣快。
相反,一些嵌入式系統處理器不包含用於浮點運算的專用硬體,或者包含只能處理單精度數字的硬體。因此,在這些系統中,無法透過硬體執行的操作由非常慢的庫函式模擬。在這種情況下,使用整數算術或(如果硬體支援)單精度浮點算術效率更高。
為了使用整數運算來處理小數,每個數字都應被視為乘以一個比例因子。為此,在輸入時每個數字都乘以該因子,在輸出時除以相同的因子,反之亦然。
使用最佳化的函式將數字轉換為字串。
將整數或浮點數轉換為字串的標準函式效率很低。為了加快這些操作,請使用非標準的最佳化函式,這些函式可能是你自己編寫的。
為了執行輸入/輸出操作,請使用舊的 C 函式(在 cstdio 標頭檔案中宣告),而不是使用 C++ 流。
C++ I/O 原語主要針對型別安全和自定義而設計,而不是針對性能,它們的許多庫實現效率很低。特別是,C 語言 I/O 函式 fread 和 fwrite 比 fstream 的 read 和 write 成員函式效率更高。
如果你必須使用 C++ 流,請使用 "\n" 而不是 std::endl,因為 std::endl 還會重新整理流。