2017-05-30 60 views
2

我有一个程序,我想测量不同输入大小的执行(wallclock)时间。测量执行时间 - 在程序代码或shell中?

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

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

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

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

或与time命令bash

time ./program 

回答

1

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

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

我会用下面的建议去:

  • 如果很容易隔离的功能,使其成为需要几秒钟(你也可以循环,但衡量比较空循环为好),那么clock_gettimetime都可以。
  • 如果不能轻松地隔离,但你的函数始终需要几百毫秒,使用clock_gettime
  • 如果无法隔离和你优化微小的东西,看看rdtsc timing for a measuring a function其中谈到测量实际执行周期。
+0

你是什么意思“隔离并使其花费几秒钟”?我应该在每次迭代中添加一次睡眠呼叫吗? – devil0150

+0

@ devil0150绝对不是! :)我的意思是,循环足够多的时间,执行时间比随机延迟/上下文切换/填充缓存更长/ ...如果测量代码的运行时间通常相差10毫秒,或者可能延迟10毫秒,决定在同一时间交换,你希望你的代码运行1秒左右,这样错误是微不足道的。或者,您可以运行数百次,精确测量每次运行并选择最低时间。 – viraptor