效能評估與效能剖析

以上述的小迴圈測量運算速度,結果即使加大N,時間也幾乎是0。最可能的原因為下列何者?

start = now();
for (i = 0; i < N; i++)
    x = a * b + i;
end = now();
  1. A因為CPU有能讓運算瞬間完成的特殊指令
  2. B因為x的值之後不會被使用,所以編譯器認為迴圈的運算不需要而將其移除
  3. C因為計時函式壞了
查看答案與解析

正確答案:B. 因為x的值之後不會被使用,所以編譯器認為迴圈的運算不需要而將其移除

啟用最佳化的編譯器,會把結果沒有被使用的運算當成不必要的程式碼(無用程式碼,dead code)而移除,或是先算出迴圈的結果並以常數取代。因此,在只取出小部分的微基準測試(microbenchmark)中,想測量的運算有時實際上並沒有被執行。對策包括輸出結果、使用volatile或阻止編譯器最佳化的手法、確認產生的機器碼等。

  • A. 沒有這樣的指令。
  • B. 正確。這是微基準測試常見的陷阱。
  • C. 計時器是正常運作的。
練習這個領域 前往領域頁面

效能評估與效能剖析的其他題目

  1. 測量程式的執行時間時,常會重複同樣的測量多次,並排除最初的幾次結果,其理由下列何者正確?
  2. 只測量一次非常短的處理時間時的問題與對策,下列組合何者正確?
  3. 在執行時間的測量方式中,「牆上時鐘時間(wall-clock time)」與「CPU時間」的差異,下列何者正確?
  4. 關於表示伺服器效能的吞吐量(throughput)與延遲(latency)的說明,下列何者正確?
  5. 評估Web服務的回應時間時,常不只看平均值,還會看第99百分位數(從慢的一端算起1%的分界)的值,其理由下列何者正確?