c++ - 为什么除法比 C++ 中的位移慢?

标签 c++ performance

我写了两段代码,一段代码将随机数除以二,另一段代码将同一个随机数右移一次。据我了解,这应该会产生相同的结果。然而,当我对两段代码进行计时时,我始终得到数据表明换档速度更快。这是为什么?

转移代码:

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/

相关文章:

performance - Joomla 1.5、2.5 和 3.0 之间的性能差异是什么?

javascript - jQuery slideToggle() 性能不佳和/或卡住 IE8

java BigInteger转换算法

mysql - 如何在 Raspberry Pi (Raspbmc > Debian) 上加速 Apache/PHP/MySQL?

javascript - 在 Emscripten 中使用 Boost

c++ - 如何删除 vector 中的重复项(不排序)C++

c++ - 从 sourceCpp 移动到带有 Rcpp 的包

c# - EventSystem.Update() 在 Android 上的第一次屏幕触摸时出现巨大的性能峰值

Linux 中 GetLocalTime 的 C++ 等效项(以毫秒为单位!)

c++:owlnext + vcl:新窗口缺少其父窗口