我正在测量执行函数compute_secret()所需的时间。下面的伪代码是我进行测量的方式。
问题在于,total_inside
(执行函数体所花费的时间,在被调用者内部进行度量)与total_outside
(在调用者内部进行度量)之间存在很大差异。例如,total_inside = 127ms
,total_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;
}
答案 0 :(得分:0)
乍一看伪代码,我看到了很多东西:
首先是它的伪代码,这妨碍了我们进行全面分析的能力:-)因此,以下评论基于我认为最可能的选择。
您实际上尚未发布get_current_time()
的代码,该代码的执行时间可能无关紧要,但并非必需。有时计时功能会妨碍精确计时。
我提到最后一点的原因是外部时间计算将包括函数计算本身,堆栈设置和拆卸,以及内部时间计算。借助外部时间来查看计时是否减少。
由于代码执行的多变,通常最好在循环中计时并平均花费的时间。就我们所知,第一次通话可能需要250毫秒,而后续通话可能需要1毫秒。
如果您真的很担心堆栈的设置和拆除(通常不会太糟糕,但是绝对不是免费的),对于寿命很短的函数,它通常会浪费代码的执行时间。实际工作完成了),还有一些选择。
例如,您可以选择更高的优化级别,或强制将函数内联,例如使其成为一个函数宏,当然,前提是您要防止所有常见的宏相关问题。