我写了一个简单的C ++程序来计时我的一些函数,并发现在编写该函数以查找从1到n的所有数字之和时,我的迭代方法比我的递归方法慢得多。我在该主题上阅读的所有内容都告诉我,相反的说法应该是正确的。当我在这里查看汇编代码https://gcc.godbolt.org/z/cajy_Y时,我注意到sumR汇编的代码比sumI的短一些,但是我仍然不明白这将如何导致我看到的速度差异。
代码如下:
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
typedef long (*fptr)(long);
const long arg = 1000000000;
double timef(fptr f){
auto start = clock();
f(arg);
auto end = clock();
return ((double) ( end-start )) / CLOCKS_PER_SEC;
}
long sumI(long num){
long long sum = 0;
for(int i = 0; i < num; i++){
sum += i;
}
return sum;
}
long sumR(long num){
if(num == 0 || num < 0)
return 0;
return num+(num-1);
}
int main()
{
cout << timef(sumI) << endl;
cout << timef(sumR) << endl;
}
编译时:
g ++ main.cpp -O3 -o递归
./递归
我的输出是:
0.898239
3e-06
有人可以向我解释编译器在优化递归函数方面做什么吗?
答案 0 :(得分:0)
您的sumR不是递归的。可能是拼写错误。
实际上,sumR和sumI等效于不执行任何操作,因为它们没有副作用,并且您将结果丢弃。因此,任何区别都可能是编译器发现将它检测为noop时更容易/更难。
进行概要分析时,必须确保您的代码确实按照您认为的那样做。另外,您必须证明不采取任何措施解决问题是不可行的。