在条件语句中使用大括号会导致性能略低

时间:2019-01-21 19:38:58

标签: c++ linux performance

简介

我正在研究一个编码实践问题,人们在其中发布执行时间,以查看谁获得了最佳性能。我写了一个递归函数来计算大数(3位数字)的模幂。

出了什么问题?

我意识到,当我不使用大括号时,我将获得更快的执行时间。我多次测试该发现,并始终得到相同的结果。

代码1

#include <iostream>
using namespace std;

int modExp(int a, int b, int c){
    if(b==0)
        return 1;
    return (a*modExp(a,b-1,c))%c;
}

int main()
{
    int A = 450;
    int B = 768;
    int C = 517;

    int result = modExp(A,B,C);
    cout << "Result is: " << result << endl;
    return 0;
}

代码1的执行时间

enter image description here

代码2

#include <iostream>
using namespace std;

int modExp(int a, int b, int c){
    if(b==0){
        return 1;
    }
    return (a*modExp(a,b-1,c))%c;
}

int main()
{
    int A = 450;
    int B = 768;
    int C = 517;

    int result = modExp(A,B,C);
    cout << "Result is: " << result << endl;
    return 0;
}

代码2的执行时间

enter image description here

我想怎么回事:

尽管执行时间用3个有效数字表示,但代码1似乎比代码2快两倍,我认为这只是一个四舍五入的问题。没有大括号的执行时间大概是0.001465s,当我使用大括号时,它引起足够的延迟,导致执行时间四舍五入为0.002s。

是否可以增加执行时间的有效位数? 我的假设正确吗?为什么您认为造成延迟?

1 个答案:

答案 0 :(得分:4)

您从一次运行的可执行文件中看到了统计噪音。这两个可执行文件对于此输入将是相同的(编译器理解为它们在逻辑上是等效的,并相应地产生输出),并且如果您将它们运行数千或数百万次并取平均值,您将看到相同的执行时间。

确实,有时语法上的细微差异可能会具有微妙的语义,因此最终会产生不同的性能,但是使用可选的范围括号并不是这种情况之一。