如何获得非常精确的经过时间C ++

时间:2016-10-18 09:58:00

标签: c++ time elapsedtime

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

我读到了chrono.h,但它使用了系统时间,我更喜欢使用CPU时间。

有没有办法做到这一点,并具有那种粒度(纳秒)?

3 个答案:

答案 0 :(得分:4)

std::chrono确实有high_resolution_clock,但请注意,处理器会限制精度。

如果你想使用libc中的函数目录,你可以使用gettimeofday但是和以前一样,不能保证这是纳秒准确的。(这只是微秒精度)< / p>

答案 1 :(得分:1)

虽然有一个标准功能 应该返回CPU时间(std::clock),但实际上并没有便携式方法。

在POSIX系统上(Linux正在尝试),std::clock应该做正确的事情。如果您想让您的应用程序可移植,请不要期望它在非POSIX平台上的工作方式相同。

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

答案 2 :(得分:1)

时钟的可实现精度是不同硬件/操作系统的属性之一,它仍然泄漏到几乎所有语言中,而且,老实说,在相同的情况下,我发现自己构建了一个足够好的自己的抽象在你的情况下往往是唯一的选择。

话虽这么说,我会避免使用STL进行高精度计时。由于它是一个没有真正实现的库标准,它必须创建一个抽象,这意味着以下之一:

  • 使用最小公分母
  • 通过与平台相关的行为泄漏硬件/操作系统详细信息

在第二种情况下,如果你想要统一的行为,你基本上回到你开始的地方。如果您能够承受可能的精度损失或标准时钟的偏差,那么一定要使用它。时钟很难和微妙。

如果你知道你的目标环境,你可以选择适当的时钟oldschool方式(#ifdef PLATFORM_ID...),例如clock_gettime()QPC),并实现您可以获得的最精确的抽象。当然,您受限于STL必须做出的相同选择,但通过减少平台集,您通常可以改善lcd要求。

如果你需要一种更理论化的方法来说服自己这个论证,你可以考虑具有最大精度的时钟集,以及对当前时间的一系列访问。对于以均匀步长均匀前进的时钟,如果两次访问发生的速度快于一个时钟的最大精度,但慢于另一个时钟的最大精度,则必然会得到不同的行为。另一方面,如果确保两次访问至少是最慢时钟的最大精度,则行为是相同的。当然,实时时钟并不是均匀推进(时钟漂移),也不是单位步进。