有一天我意外地注意到了这一点,现在决定对它进行广泛的测试。为什么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