如果您有一個變量A,永遠不會變化並始終等於零,函數F,函數G和函數H,並在現代英特爾臺式機處理器上調用以下代碼在現代版本的GCC上-O3優化:無法解釋C++性能
for(i = 0; i < a_big_number; i++)
{
if(A != 0) F();
else G();
}
需要2秒鐘執行。注意F永遠不會被調用,因爲A總是0.或者,
for(i = 0; i < a_big_number; i++)
{
if(A != 0) H();
else G();
}
只需要1秒鐘執行。再次,A總是0,而H從來不被調用。最後,
for(i = 0; i < a_big_number; i++)
{
G();
}
只需要0.5秒執行。
鑑於前兩個例子中的條件陳述,爲什麼F和H的內容是什麼?既然他們從來沒有被調用過,爲什麼它們會影響他們的工作?鑑於英特爾處理器具有複雜的分支預測,處理器不應該知道G()總是被調用,甚至不會浪費時間在條件語句上?我明白有條件的教學應該浪費一些時間,但我不明白爲什麼浪費那麼多時間。
請提供一個完整,簡單,可編譯的獨立示例,演示相對性能。 (另外,請注意,幾秒或更短時間內運行的基準很可能會產生非常嘈雜的結果,並且請注意,找出性能差異的原因的最佳方法通常是查看生成的程序集。 ) – 2012-04-17 20:55:09
爲什麼比較語句需要零時間?如果GCC沒有足夠的信息對其進行優化,則需要執行CPU週期。 – dasblinkenlight 2012-04-17 20:56:34
F,G或H中的任何一個是否聲明爲「inline」?是一個聲明的'const'?這三個代碼片段是否出現在一個'main'中?關於後者:緩存可能解釋一些性能差異;嘗試重新排序三個代碼塊。 – 2012-04-17 20:58:22