C++越跑越慢的問題?

我自己寫了一個日誌類。想試下效率怎麼樣,就試了一下,發現前3000條速度很快,沒有用多長時間,3000條之後用時就長了,很長,簡直不能忍受。所以我懷疑是我寫的log類的問題。然後就改呀改。可是沒有效果。然後我就試了下只是輸出一個自加的數需要多長時間,結果也是當計數到了3000以上時速度明顯就降下來了。也沒有越來越慢,而是穩定在一個速度上,可是為什麼3000之前速度跟之後速度是兩個樣子。背後有什麼說法么。

老規矩,貼代碼

#include &
#include &
#include &
#include &
#include &
using namespace std::chrono;
int main()
{
int i = 0;
while (true)
{
steady_clock::time_point t1 = steady_clock::now();
std::cout &<&< i &<&< std::endl; i++; steady_clock::time_point t2 = steady_clock::now(); duration& time_span = duration_cast&&>(t2 - t1);
std::cout &<&< time_span.count() &<&< " seconds."&<&

運行環境是VS2013 ,編譯方式為release編譯。

這個是計數比較大的時候每次自加用的時間

這個是計數比較小的時候自加用的時間


雖然這個答案里很多有經驗的人可以直接告訴你答案,不過我建議你自己尋找問題癥結。這種典型的性能優化問題,處理的正確姿勢不是猜,而是上profiler,用工具分析是哪句代碼在消耗時間。

用VC的話,Visual Studio自帶profiler。

Beginners Guide to Performance Profiling

用gcc的話,也不難。

使用 GNU profiler 來提高代碼運行速度


因為cmd下面的輸出就是很慢的,你把cout刪掉,程序瞬間就結束了。


大部分時間花在向控制台寫數據上了,不信你把輸出重定向到文件,就會發現你輸出的時間穩定在同一個數量級上。

找到你的程序的位置,打開cmd,然後

LightLoger.exe &> a.txt


把取消同步打開就好了。


不要每一步都輸出……

曾經試過一億次的運算。。。

不加cout一兩秒就能跑出。

加了cout……

也許會跑一天吧(/≧ω\)

只要用if限制一下輸出次數也是能夠快很多的


可能3000這個數是清IO緩衝的一個門限值吧。到3000緩存滿了,要做一些IO操作,於是性能就不行了。


日誌記錄內存中,滿了再轉儲或者輸出,同樣的事情批量做,集中io


推薦閱讀:

求講解下列鏈接以及pascal嵌套子程序是如何實現的?
關於c前置,後置++,及函數傳參的問題?
已經不在學校了,在軟體專業上,該怎麼制定學習的策略?
國內哪一家公司的編譯隊伍技術最高?
typeid如何得出變數的類型?

TAG:編程 | 計算機科學 | C | 編譯原理 | CC |