如果我们的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语句花费更多时间?
答案 0 :(得分:0)
差异几乎可以肯定是由于编译器优化。你必须看看装配以确保,但这是我对发生的事情的看法:
在第一个例子中,优化器认识到if
的主体没有效果是微不足道的。在每个if
的本地变量被声明,分配并立即销毁。因此if
被优化掉了,留下了一个空的for
循环也被优化了。
第二个例子中的情境并非整体而言微不足道。 琐碎的是,循环的主体归结为单个res++
,其中很可能会进一步优化为++res
。但由于res
不是循环的本地,优化器必须考虑整个main()
函数以实现循环无效。很可能它没有这样做。
结论:在目前的形式下,测量结果毫无意义。禁用优化也无济于事,因为您永远不会为生产构建执行此操作。如果您真的想深入了解这一点,我建议您观看CppCon 2015: Chandler Carruth "Tuning C++: Benchmarks, and CPUs, and Compilers! Oh My!",了解如何在这些类型的语言中处理优化器。