为什么if语句和变量声明比循环中的加法更快?

时间:2017-03-05 03:23:54

标签: c++ loops

如果我们的if语句带有如下变量的声明:

#include <iostream>
#include <ctime>

using namespace std;

int main() {

    int res = 0;

    clock_t begin = clock();
    for(int i=0; i<500500000; i++) {
        if(i%2 == 0) {int fooa; fooa = i;}
        if(i%2 == 0) {int foob; foob = i;}
        if(i%2 == 0) {int fooc; fooc = i;}
    }
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;

    cout << elapsed_secs << endl;

    return 0;
}

结果是:

1.44

Process returned 0 (0x0)   execution time : 1.463 s
Press any key to continue.

但是,如果是:

#include <iostream>
#include <ctime>

using namespace std;

int main() {

    int res = 0;

    clock_t begin = clock();
    for(int i=0; i<500500000; i++) {
        res++;
        res--;
        res++;
    }
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;

    cout << elapsed_secs << endl;

    return 0;
}

结果是:

3.098

Process returned 0 (0x0)   execution time : 3.115 s
Press any key to continue.

为什么加法或减法比带有变量声明的if语句花费更多时间?

1 个答案:

答案 0 :(得分:0)

差异几乎可以肯定是由于编译器优化。你必须看看装配以确保,但这是我对发生的事情的看法:

在第一个例子中,优化器认识到if的主体没有效果是微不足道的。在每个if的本地变量被声明,分配并立即销毁。因此if被优化掉了,留下了一个空的for循环也被优化了。

第二个例子中的情境并非整体而言微不足道。 琐碎的是,循环的主体归结为单个res++,其中很可能会进一步优化为++res。但由于res不是循环的本地,优化器必须考虑整个main()函数以实现循环无效。很可能它没有这样做。

结论:在目前的形式下,测量结果毫无意义。禁用优化也无济于事,因为您永远不会为生产构建执行此操作。如果您真的想深入了解这一点,我建议您观看CppCon 2015: Chandler Carruth "Tuning C++: Benchmarks, and CPUs, and Compilers! Oh My!",了解如何在这些类型的语言中处理优化器。