有一天我意外地注意到了這一點,現在決定對它進行廣泛的測試。爲什麼const int比const int&更快?
所以,當我調用一個函數:
#define Type int
#define Prm const Type &
Type testfunc1(Prm v1, Prm v2, Prm v3, Prm v4, Prm v5, Prm v6, Prm v7, Prm v8, Prm v9, Prm v10){
return (v1|v2|v3|v4|v5|v6|v7|v8|v9|v10);
}
了100萬次:
for(Type y = 0; y < 10000; y++){
for(Type x = 0; x < 10000; x++){
out |= testfunc1(x,y,x,x,y,y,x,y,x,y);
}
}
隨着類型int
,const int
和const int &
,我注意到,const int
比const int &
更快。 (注意:即時通訊使用返回值來確保函數不會被優化)。
這是爲什麼?我一直認爲加入&
實際上會讓它更快,但測試說的是相反的。我知道更大的數據類型可能會有不同的結果,但我沒有測試過,因爲我對結果非常肯定。
我的測試:
const int: 7.95s
const int &: 10.2s
編輯:我想這是因爲我對建築的真心;我Sint64
型式試驗,結果是:
const Sint64: 17.5s
const Sint64 &: 16.2s
EDIT2:是這樣嗎?與double
型式試驗(這是64位?),而結果讓我不解:
const double: 11.28s
const double &: 12.34s
EDIT3:更新循環代碼與64位類型匹配我的最新測試。
像你一樣使用返回值並不能確保它不會被優化。現在,整個計算可以在編譯時完成,因此編譯器可以優化所有內容,只需用'0x3FFF'代替循環。 – 2012-03-09 16:51:36
我會對這個問題的答案感興趣。這可能是const int的處理方式與函數prolog代碼(由編譯器放入)不同,而不是const int&。我正在接受一個有教養的猜測。 – octopusgrabbus 2012-03-09 16:53:23
@ R.MartinhoFernandes,好吧,如果它確實優化了它,它不會執行它7.95秒;更不用說我的編譯器不是那麼聰明(它設法只在給參數的常量值時優化它) 。 – Rookie 2012-03-09 16:53:30