函数需要很长时间才能返回

时间:2019-07-03 10:00:20

标签: c

我正在测量执行函数compute_secret()所需的时间。下面的伪代码是我进行测量的方式。 问题在于,total_inside(执行函数体所花费的时间,在被调用者内部进行度量)与total_outside(在调用者内部进行度量)之间存在很大差异。例如,total_inside = 127mstotal_outside = 238ms

我知道调用和从函数调用返回都需要一些时间。但这不应该花很长时间。

那么调用和从函数返回时花费太多时间的常见原因是什么?

int encrypt(args){
    time start_inside = get_current_time();
    /**
         actually compute stuff
     **/
    time end_inside = get_current_time();
    time total_inside = end_inside - start_inside;
}

int main(){
    time start_outside = get_current_time();

    encrypt(args);

    time end_outside = get_current_time();
    time total_outside = end_outside - start_outside;
}

1 个答案:

答案 0 :(得分:0)

乍一看伪代码,我看到了很多东西:

  • 首先是它的伪代码,这妨碍了我们进行全面分析的能力:-)因此,以下评论基于我认为最可能的选择。

  • 您实际上尚未发布get_current_time()的代码,该代码的执行时间可能无关紧要,但并非必需。有时计时功能会妨碍精确计时。

  • 我提到最后一点的原因是外部时间计算将包括函数计算本身,堆栈设置和拆卸,以及内部时间计算。借助外部时间来查看计时是否减少。

  • 由于代码执行的多变,通常最好在循环中计时并平均花费的时间。就我们所知,第一次通话可能需要250毫秒,而后续通话可能需要1毫秒。

如果您真的很担心堆栈的设置和拆除(通常不会太糟糕,但是绝对不是免费的),对于寿命很短的函数,它通常会浪费代码的执行时间。实际工作完成了),还有一些选择。

例如,您可以选择更高的优化级别,或强制将函数内联,例如使其成为一个函数宏,当然,前提是您要防止所有常见的宏相关问题。