我有以下代码:
#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,在 Release模式下进行编译。
我的机器运行的是Windows 7 Enterprise(64位)。
对我而言,有趣的是乘法快于移位,这是由于编译阶段进行了一些优化吗?
谢谢。
编辑:使用下面的建议,我反汇编了二进制文件,并且看来乘法时,编译器使用某种与MMX指令结合的循环展开。对于移位,移位直接在常规处理器寄存器中完成。
最佳答案
我没有完整的答案,因为我需要Visual Studio Express 2013进行验证,但是可以指出一些注意事项。
关于c++ - 为什么左移运算符比乘法(C++)慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23991313/