效能評估與效能剖析
以上述的小迴圈測量運算速度,結果即使加大N,時間也幾乎是0。最可能的原因為下列何者?
start = now();
for (i = 0; i < N; i++)
x = a * b + i;
end = now();
- A因為CPU有能讓運算瞬間完成的特殊指令
- B因為x的值之後不會被使用,所以編譯器認為迴圈的運算不需要而將其移除
- C因為計時函式壞了
查看答案與解析
正確答案:B. 因為x的值之後不會被使用,所以編譯器認為迴圈的運算不需要而將其移除
啟用最佳化的編譯器,會把結果沒有被使用的運算當成不必要的程式碼(無用程式碼,dead code)而移除,或是先算出迴圈的結果並以常數取代。因此,在只取出小部分的微基準測試(microbenchmark)中,想測量的運算有時實際上並沒有被執行。對策包括輸出結果、使用volatile或阻止編譯器最佳化的手法、確認產生的機器碼等。
- A. 沒有這樣的指令。
- B. 正確。這是微基準測試常見的陷阱。
- C. 計時器是正常運作的。