我有以下代码:
#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指令组合。对于移位,移位直接在普通处理器寄存器中完成。答案 0 :(得分:0)
我没有完整的答案,因为我需要Visual Studio Express 2013进行验证,但是可以指出一些注意事项。
在发布模式下,乘以2可以替换为&lt;&lt;操作(通过编译器),所以你应该检查汇编程序输出。
“1”的类型是“int”,“a”是“uint”。它可以产生不同的代码。
矢量化可能不稳定并且工作在“*”情况下但不在“&lt;&lt;”中,也应检查汇编程序输出。