gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:31 24 4
gpt4 key购买 nike

如果我们有这样的带有变量声明的 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 语句需要更多的时间来运行?

最佳答案

差异几乎可以肯定是由于编译器优化造成的。您必须查看程序集才能确定,但​​这是我对所发生情况的看法:

在第一个示例中,优化器很容易意识到 if 的主体无效。在每个 if 的局部变量中,声明、分配并立即销毁。所以 if 被优化掉了,留下一个空的 for 循环也被优化掉了。

第二个例子中的情况总体上并不那么微不足道。 微不足道的是,循环体归结为单个 res++,很可能会进一步优化为 ++res。但是因为 res 不是循环的局部,优化器必须考虑整个 main() 函数以实现循环没有效果。它很可能没有这样做。

结论:在目前的形式下,测量是没有意义的。禁用优化也无济于事,因为您永远不会为生产构建这样做。如果你真的想深入研究这个,我建议观看 CppCon 2015: Chandler Carruth "Tuning C++: Benchmarks, and CPUs, and Compilers! Oh My!"有关如何在这些情况下处理优化器的重要建议。

关于c++ - 为什么 if 语句和变量声明比循环中的加法更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42604153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com