测量执行时间 - 在程序代码中还是在shell中?

时间:2017-05-30 10:13:25

标签: c++ linux time

我有一个程序,我想测量不同输入尺寸的执行时间(挂钟)。

在其他一些类似的问题中,我读到在源代码中使用clock_gettime是不可靠的,因为CPU分支预测器,寄存器重命名,推测执行,无序执行等,有时甚至优化器都可以将clock_gettime调用移动到除我放置之外的地方。

但我读到的这些问题是关于测量特定功能的时间。如果我测量整个程序(即main函数),这些问题是否仍然存在?我正在寻找相对测量,不同输入尺寸的执行时间如何变化,而不是绝对值。

我如何获得更好的结果?在代码中使用计时功能:

start = clock_gettime();
do_stuff();
end = clock_gettime();
execution_time = end - start;

或使用time中的bash命令:

time ./program

1 个答案:

答案 0 :(得分:1)

计划中的测量将为您提供更准确的答案。当然,从理论上讲,在某些情况下,您可以将clock_gettime电话移到您不期望的地方。实际上,如果你之间只有一个函数调用,它就不会发生。 (如果有疑问,请检查生成的汇编代码)

在shell中调用time将包含您不关心的内容,例如加载可执行文件并进入有趣点所花费的时间。另一方面,如果你的do_stuff需要几秒钟,那么它并不重要。

我遵循以下建议:

  • 如果您可以轻松地隔离您的功能并花费几秒钟(您也可以循环它,但也可以测量空循环以进行比较),那么clock_gettimetime将只做细。
  • 如果您无法轻易隔离,但您的功能始终需要数百毫秒,请使用clock_gettime
  • 如果你无法孤立并且你正在优化微小的东西,请看rdtsc timing for a measuring a function谈论测量实际执行周期。