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

C++ 为什么左移运算符比乘法(C+;+;)慢?,c++,optimization,visual-studio-2013,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) {

我有以下代码:

#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;
}
#包括“time.h”
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
无符号整数a=2;
无符号长和=0;
时钟开始=时钟();
对于(size_t i=1;i),这比下面的行快

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


  • 在发布模式下,2的乘法可以替换为:你可以反汇编二进制文件,看看这两个片段是如何在汇编程序中翻译的。基准测试很难。顺便说一句,一个真正聪明的编译器可能会意识到你只是在计算2000000000*20000001,并完全避免循环。你还应该检查差异是否正确可在大量运行中复制…可能是一些瞬时的系统负载使倍数看起来更快。是的,每个版本我至少测量了10次。