首先,使用初始化变量是a sin.
优化器肯定发现循环是无用的(真的,应该是什么值x
, y
, z
在循环);并且循环的结果没有被使用(没有副作用),所以它删除了生成代码中的循环。
void take_time()
{
Foo f;
auto t1 = std::chrono::system_clock::now();
register int c = 0;
int x,y,z;
///// Result not used
for (c=0;c<10000;c++){ // even if i put 1000000000 it will take 0 nanosec !!!!!
f.z = x+y;
f.z += z-x+y;
}
/// We can discard the above
std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}
顺便说一句,register
关键字there已被弃用。
对于 GCC 和 clang,有一种方法可以“吓唬”优化器,使其无法优化某些变量的使用。我使用这个功能:
template<typename T>
void scareTheOptimizer(T& x){
asm volatile("" :: "p"((volatile void*)&x) : "memory");
}
因此,当您在循环中调用它时,您现在应该看到一些计时。
void take_time()
{
Foo f;
auto t1 = std::chrono::system_clock::now();
int c = 0;
int x=0,y=0,z=1;
for (c=0;c<10000;c++){
f.z = x+y;
scareTheOptimizer(f.z); /// <---- Added Here
f.z += z-x+y;
}
std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}
See it 住在科里鲁