如何用C语言测量时间?
我想知道某个代码块执行了多长时间(大约)。像这样:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
怎么样?
I want to find out for how long (approximately) some block of code executes. Something like this:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
How?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
中使用
clock
方法您可以在 time.h示例 :
You can use the
clock
method in time.hExample:
您可以使用 time.h 库,特别是 时间 和 difftime 函数:(
改编自上面链接的 difftime 网页的示例。)
请注意,此方法只能给出秒级的精度 -
time_t
记录自 UNIX 纪元(1970 年 1 月 1 日)以来的秒数。You can use the time.h library, specifically the time and difftime functions:
(Example adapted from the difftime webpage linked above.)
Please note that this method can only give seconds worth of accuracy -
time_t
records the seconds since the UNIX epoch (Jan 1st, 1970).有时需要测量天文时间而不是CPU时间(尤其适用于Linux):
Sometime it's needed to measure astronomical time rather than CPU time (especially this applicable on Linux):
标准 C 库提供了
time
函数,如果您只需要比较秒,则该函数非常有用。不过,如果您需要毫秒精度,最便携的方法是调用 timespec_get 。如果系统支持的话,它可以报出高达纳秒精度的时间。然而,调用它需要更多的努力,因为它涉及一个结构。下面的函数仅将结构转换为简单的 64 位整数。与
clock
不同,此函数返回一个Unix时间戳,因此它将正确地考虑阻塞函数(例如sleep
)所花费的时间。对于基准测试和实现考虑运行时间的延迟来说,这是一个有用的属性。The standard C library provides the
time
function and it is useful if you only need to compare seconds. If you need millisecond precision, though, the most portable way is to calltimespec_get
. It can tell time up to nanosecond precision, if the system supports. Calling it, however, takes a bit more effort because it involves a struct. Here's a function that just converts the struct to a simple 64-bit integer.Unlike
clock
, this function returns a Unix timestamp so it will correctly account for the time spent in blocking functions, such assleep
. This is a useful property for benchmarking and implementing delays that take running time into account.GetTickCount()。
GetTickCount().
为了完整起见,有比中的
GetTickCount()
或clock()
更精确的时钟计数器,它只提供 32 位结果,可以相对较快地溢出。它是 QueryPerformanceCounter()。QueryPerformanceFrequency()
获取时钟频率,它是两个计数器差异的除数。类似CLOCKS_PER_SEC
。For sake of completeness, there is more precise clock counter than
GetTickCount()
orclock()
which gives you only 32-bit result that can overflow relatively quickly. It's QueryPerformanceCounter().QueryPerformanceFrequency()
gets clock frequency which is a divisor for two counters difference. Something likeCLOCKS_PER_SEC
in <time.h>.我会使用 QueryPerformanceCounter 和 QueryPerformanceFrequency Windows API 函数。在块之前和之后调用前者并减去(当前 - 旧)以获得实例之间的“刻度”数。将其除以后一个函数获得的值即可得到持续时间(以秒为单位)。
I would use the QueryPerformanceCounter and QueryPerformanceFrequency functions of the Windows API. Call the former before and after the block and subtract (current − old) to get the number of "ticks" between the instances. Divide this by the value obtained by the latter function to get the duration in seconds.
如果您不需要出色的分辨率,可以使用 GetTickCount(): http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx
(如果它不是为了您自己的简单诊断,那么请注意,这个数字可能会回绕,因此您需要用一些算术来处理它)。
QueryPerformanceCounter 是另一个合理的选择。 (MSDN上也有描述)
If you don't need fantastic resolution, you could use GetTickCount(): http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx
(If it's for something other than your own simple diagnostics, then note that this number can wrap around, so you'll need to handle that with a little arithmetic).
QueryPerformanceCounter is another reasonable option. (It's also described on MSDN)