如何在C++中获取非常精确的经过时间

7

我正在Ubuntu上运行我的代码,并需要获取程序中一个函数的运行时间。我需要非常精确的时间,如纳秒或至少微秒。

我看了一下chrono.h,但它使用系统时间,而我更喜欢使用CPU时间。

是否有一种方法可以做到这一点,并具有纳秒级别的精度?


1
如果您想要CPU时间,但也想要<chrono>提供的好处,那么您应该实现符合标准中概述的时钟类型的时钟,并提供CPU时间,可能在内部使用std::clock()实现。 - Hatted Rooster
1
高分辨率时钟怎么样? - Some programmer dude
1
@JoachimPileborg确实如此,但是他们中没有一个承诺像OP所问的CPU时钟时间。 - Hatted Rooster
甚至在Windows中,性能计数器也没有如此好的分辨率。最好的情况是1毫秒,然后你必须调整全局设置才能达到这个水平。 - Robinson
@mhm,很好,我们有std::chrono::I_am_sure_this_clock_runs_on_cpu_time - Hatted Rooster
显示剩余4条评论
3个回答

4

std::chrono 提供了 high_resolution_clock,但要注意精度会受处理器限制。

如果你想直接使用libc中的函数,可以使用gettimeofday,但是无法保证其准确到纳秒级别。(只能精确到微秒)


1
由于任何时间查询都涉及内核调用,因此在进入和退出内核模式时所失去的时间可能会丢失足够的纳秒,使得任何尝试实现纳秒精度都变得无意义。 - doron
+1 high_resolution_clock 应该是最好的选择。但它不能保证具有纳秒级别的分辨率。它应该只是系统中分辨率最高的时钟。如果你想要绝对确定,你就需要查看你的操作系统是否支持测量时间的功能(例如 Windows 上的 QueryPerformanceFrequency/Counter)。 - Tropid

2
时钟的可达精度是不同硬件/操作系统的属性之一,它仍然泄露到几乎每种语言中。老实说,在我遇到相同情况时,我发现建立一个足够好的自己的抽象通常是唯一的选择。
话虽如此,我会避免使用STL进行高精度计时。由于它是一个没有真正实现的库标准,因此必须创建一个抽象,这意味着其中之一:
- 使用最小公分母 - 通过平台相关行为泄漏硬件/操作系统细节
在第二种情况下,如果您想要统一的行为,则基本上回到了起点。如果您可以承受可能的精度损失或标准时钟的偏差,那么请尽管使用它。时钟是困难而微妙的。
如果您知道目标环境,则可以以老派方式选择适当的时钟(#ifdef PLATFORM_ID...),例如 clock_gettime()QPC),并实现您可以获得的最精确的抽象。当然,您受到STL必须做出的相同选择的限制,但通过减少平台集,通常可以改善lcd要求。
如果您需要更理论化的方法来说服自己进行这种论证,您可以考虑具有最大精度的时钟集和对当前时间的访问序列。对于以均匀步长均匀前进的时钟,如果两个访问比一个时钟的最大精度快但比另一个时钟的最大精度慢,您将得到不同的行为。另一方面,如果您确保两个访问至少间隔最慢时钟的最大精度,则行为相同。现在当然,真实的时钟并不是均匀前进的(时钟漂移),也不是单位步长。

1

虽然有一个标准函数std::clock应该返回 CPU 时间,但实际上没有一种可移植的方法来实现这一点。

在 POSIX 系统(Linux 就是试图成为这样的系统)上,std::clock 应该能够正常工作。但是,如果您希望使您的应用程序具有可移植性,则不要指望它在非 POSIX 平台上运行相同。

std::clock 返回的值也是近似值,并且精度和分辨率取决于系统。


1
在 POSIX 系统上(可能适用于 Ubuntu),CLOCKS_PER_SEC 是 1000000,这意味着时钟只有微秒分辨率。 - doron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接