最近在看《c++ 效能優化指南》書籍,從書中學習到了不少c++ 程式優化的點,平時**中一定要注意這些坑,在此記錄下來。本篇幅主要是講下字串處理效能的優化。
一.下面來看乙個簡單的例子,我們平時 寫** 不注意的時候,最有可能寫出的是如下所示的第一種 remove_ctrl() 形式的**。
#include #include #include #include #include using namespace std;
string remove_ctrl(string s) //沒有優化的**
}return result;
} string remove_ctrl2(string s) //使用復合賦值 避免臨時字串
}return result;
} string remove_ctrl3(string s) //預留儲存空間,減少記憶體的重新分配
}return result;
} string remove_ctrl4(const string& s) //
}return result;
} void test()
gettimeofday(&end,null);
time1 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec;
gettimeofday(&start,null);
for(int i=0;i < 10000;++i)
gettimeofday(&end,null);
time2 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec;
gettimeofday(&start,null);
for(int i=0;i < 10000;++i)
gettimeofday(&end,null);
time3 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec;
gettimeofday(&start,null);
for(int i=0;i < 10000;++i)
gettimeofday(&end,null);
time4 = ( end.tv_sec - start.tv_sec ) * 1000 * 1000 + end.tv_usec - start.tv_usec;
cout << " time1 is :" << time1 << " us" << endl;
cout << " time2 is :" << time2 << " us" << endl;
cout << " time3 is :" << time3 << " us" << endl;
cout << " time4 is :" << time4 << " us" << endl;
} int main()
程式執行的結果如下:
從上面的結果可以看到,第一種方式字串處理 效率最低。
(1).remove_ctrl函式中result + s[i] 運算開銷很大,它會呼叫記憶體管理器去構建乙個臨時字串物件來儲存連線後的字串,若字串str的長度是n,則需要呼叫n次記憶體管理器建立臨時字串物件,需要呼叫n 次記憶體管理器來釋放記憶體。
(2).remove_ctrl2 函式優化的主要是 利用復合賦值 避免臨時字串的建立,從上圖中可以看出,相比較第一種方法效能提公升很多。
(3).remove_ctrl3 中,result 字串分配的記憶體空間 是乙個動態增長過程,result 字串會被反覆的複製到乙個更大的內部緩衝區。 每次result字串緩衝區發生溢位時,按照std::string 字串處理方式 會申請兩倍的記憶體空間。那麼在整個處理過程中,會根據輸入字串長度大小,多次申請 分配新的記憶體空間。通過reserve() 函式 預先分配好足夠的記憶體大小空間 來進行優化。
(4).remove_ctrl4 中主要是通過常量引用 傳入引數,省去了引數在函式中的一次 昂貴的記憶體分配。上面3種函式的引數 將會通過複製建構函式來進行初始化,需要一次記憶體的分配。
C 程式效能優化
一段c程式,功能開發完成,開始效能優化。當然是先用 pg 編譯,再gprof看 熱點 在 很快找到,是計算hash值的函式,於是換了個更快的hash函式 fnv 速度提高了一些。接著把該hash函式內聯 inline 程式又快了一些。內聯函式不是解決效能問題的靈丹妙藥,因為inline之後gprof...
優化程式效能
編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...
優化程式效能
l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...