为什么在求和函数中迭代比递归慢?

时间:2018-12-02 01:58:30

标签: c++ performance loops recursion

我写了一个简单的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

有人可以向我解释编译器在优化递归函数方面做什么吗?

1 个答案:

答案 0 :(得分:0)

您的sumR不是递归的。可能是拼写错误。

实际上,sumR和sumI等效于不执行任何操作,因为它们没有副作用,并且您将结果丢弃。因此,任何区别都可能是编译器发现将它检测为noop时更容易/更难。

进行概要分析时,必须确保您的代码确实按照您认为的那样做。另外,您必须证明不采取任何措施解决问题是不可行的。