2014-09-01 76 views
0

我試圖找出2e6跳轉的「for循環」的確切執行時間。 下面的代碼在從g ++編譯爲C++文件後的10ms內運行。 人們告訴我,這是由C++編譯器自動完成的優化代碼,所以你 得到毫無意義的執行時間。換句話說,因爲沒有任何輸出呼叫 如printf或COUT < <變量A,B,C這樣的優化代碼將用於 做什麼,「for循環」,這就是爲什麼我真的很短的編程執行時間在10ms內。對 ?他們爲什麼說時間結果對於「for循環」是沒有意義的。10毫秒C++執行時間

請告知

int main(){ 
int max = 2e6; 
int a,b,c; 
// CODE YOU WANT TO TIME 
    int start = getMilliCount(); 
    for (int i = 0; i < max; i++) { 
    a = 1234 + 5678 + i; 
    b = 1234 * 5678 + i; 
    c=1234/2+i; 
    } 
int milliSecondsElapsed = getMilliSpan(start); 
printf("\n\nElapsed time = %u milliseconds %d\n", milliSecondsElapsed,max); 
    return 0; 
} 
+2

請參見[裝配輸出](http://goo.gl/HDSOiv)。 – 2014-09-01 11:17:43

+1

編譯器確實可以完全清除循環,如果它可以證明它沒有副作用(就像你的例子)。我不明白你對'please advise'的期望。建議...什麼? – bolov 2014-09-01 11:19:29

+0

您可以聲明'c'變量,以強制其值在每次迭代時被計算和分配。我不知道這個結果是多少有些沒有意義。 – 2014-09-01 12:02:09

回答

2

編譯器可以以任何不會改變任何可觀察的方式改變程序,即所有輸出等必須爲,正好與未優化代碼的輸出相同。在您的例子中,編譯器可能會注意到,從未使用過的abc循環之後的值,循環就沒有別的,所以還不如從你的程序中刪除循環。

它也可以觀察到的變量值直接依賴於max,只是跳過所有,但最後一次迭代。

在這兩種情況下,結果將不依賴於max。它仍然沒有意義,只是意味着你低估了你的編譯器。

編輯:

我測試了此方案與g++ -O2,循環得到徹底清除,並且不運行在所有。

+0

什麼是-O2選項?如何在沒有優化的情況下編譯它,以便我可以看到優化與非優化之間的時間差異? – aabb 2014-09-01 11:30:38

+0

http://stackoverflow.com/questions/668103/how-to-tell-compiler-to-not-optimize-certain-code-away鏈接被提及優化 – aabb 2014-09-01 11:52:55

+0

對不起,它是2e6不是2e8,當我改變(非選擇代碼:最大= 2e6-> 10ms,最大= 2e8-.1000ms)和(優化代碼:最大= 2e6-> 4ms,最大= 2e8-> 400ms),最大速度從2e6到2e8, ,但結果不能證明「for循環」操作是否正在執行 – aabb 2014-09-01 12:02:57

4

運行時是絕對不無意義。它至少證明了一個重要的觀點:優化器比信譽更聰明,並且能夠推斷出循環沒有副作用,所以它將其切斷。

所以即使配置文件的結果只能證明這一點,但它確實具有意義。

爲了解決你想要什麼:

我試圖找出個「for循環」與2E8 iteritions確切的執行時間。

一個for環與2e8執行時間可以是0如果沒有可觀察到的影響。或者如果他們是非常大的。這就是爲什麼你通常使用專用工具來分析實際代碼。

+0

所以,實際上,在for循環必須運行在程序exe文件2E8 iteritions,對不對?所以這是循環實時10ms – aabb 2014-09-01 11:19:45

+0

@aabb我沒有這麼說。 for循環可能根本不運行。 – 2014-09-01 11:20:13

+0

由於main()中沒有其他調用或函數來調用變量a,b,c。所以如果編譯器足夠聰明,優化代碼可以不包括來自「fop loop」的代碼,對吧?如果是這樣,那就是爲什麼我得到了10ms對於「for循環」執行時間毫無意義的原因,請告知 – aabb 2014-09-01 11:22:36