我写了两段代码,一段代码将随机数除以二,另一段代码将同一个随机数右移一次。据我了解,这应该会产生相同的结果。然而,当我对两段代码进行计时时,我始终得到数据表明换档速度更快。这是为什么?
转移代码:
double iterations = atoi(argv[1]) * 1000;
int result = 0;
cout << "Doing " << iterations << " iterations." << endl;
srand(31459);
for(int i=0;i<iterations;i++){
if(i % 2 == 0){
result = result + (rand()>>1);
}else{
result = result - (rand()>>1);
}
}
分割代码:
double iterations = atoi(argv[1]) * 1000;
int result = 0;
cout << "Doing " << iterations << " iterations." << endl;
srand(31459);
for(int i=0;i<iterations;i++){
if(i % 2 == 0){
result = result + (rand() / 2);
}else{
result = result - (rand() / 2);
}
}
时间和结果:
$ time ./divide 1000000; time ./shift 1000000
Doing 1e+09 iterations.
real 0m12.291s
user 0m12.260s
sys 0m0.021s
Doing 1e+09 iterations.
real 0m12.091s
user 0m12.056s
sys 0m0.019s
$ time ./shift 1000000; time ./divide 1000000
Doing 1e+09 iterations.
real 0m12.083s
user 0m12.028s
sys 0m0.035s
Doing 1e+09 iterations.
real 0m12.198s
user 0m12.158s
sys 0m0.028s
附加信息:
- 编译时我没有使用任何优化
- 我在 Fedora 20 的虚拟化安装上运行它,内核:3.12.10-300.fc20.x86_64
最佳答案
不是;它在您运行的体系结构上较慢。它几乎总是比较慢,因为位移背后的硬件是微不足道的,而除法则有点像噩梦。在基数 10 中,78358582354 >> 3 或 78358582354/85 哪个更容易?无论输入如何,指令通常都需要相同的时间来执行,在您的情况下,将 /2
转换为 是编译器的工作>>1
; CPU 只是按照指令执行。
关于c++ - 为什么除法比 C++ 中的位移慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22060963/