为什么左移运算符比乘法(C ++)慢?

时间:2014-06-02 09:29:03

标签: c++ optimization visual-studio-2013

我有以下代码:

#include "time.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    unsigned int a = 2;
    unsigned long long sum = 0;

    clock_t begin = clock();
    for (size_t i = 1; i <= 2000000000; ++i)
    {
        //sum += i * a; --> this is faster than the below line
        sum += i << 1;
    }
    clock_t end = clock();

    cout << "time: " << ((double)end - begin) / CLOCKS_PER_SEC << endl;
    cout << "sum: " << sum << endl;
    return 0;
}

对于带乘法的代码,我得到:1.170秒。 对于带左移操作符的代码,我得到:1.436秒。

我使用Visual Studio Express 2013,我在发布模式下编译。 我的机器运行的是Windows 7 Enterprise,64位。

有趣的是,乘法比移位快,这是否是由于编译阶段的一些优化?

谢谢。

编辑:使用下面的建议,我反汇编了二进制文件,似乎乘法,编译器使用某种类型的循环展开与MMX指令组合。对于移位,移位直接在普通处理器寄存器中完成。

1 个答案:

答案 0 :(得分:0)

我没有完整的答案,因为我需要Visual Studio Express 2013进行验证,但是可以指出一些注意事项。

  1. 在发布模式下,乘以2可以替换为&lt;&lt;操作(通过编译器),所以你应该检查汇编程序输出。

  2. “1”的类型是“int”,“a”是“uint”。它可以产生不同的代码。

  3. 矢量化可能不稳定并且工作在“*”情况下但不在“&lt;&lt;”中,也应检查汇编程序输出。