如何得到非常精确的运行时间c++

How get very precise elapsed time C++

本文关键字:运行时间 c++ 何得 非常      更新时间:2023-10-16

我在Ubuntu上运行我的代码,我需要得到关于我的程序中一个函数的运行时间。我需要一个非常精确的时间,比如纳秒,或者至少是微秒。

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

是否有办法做到这一点,并有粒度(纳秒)?

std::chrono确实有一个high_resolution_clock,但请记住,精度受到处理器的限制。

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

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

话虽如此,我还是会避免使用STL来实现高精度定时。因为它是一个库标准,没有一个真正的实现,所以它必须创建一个抽象,这意味着:

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

在第二种情况下,如果你想有统一的行为,你基本上回到了你开始的地方。如果您可以承受标准时钟可能的精度损失或偏差,那么请务必使用它。时钟是坚硬而微妙的。

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

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

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

在POSIX系统上(Linux正在尝试成为POSIX系统),那么std::clock应该做正确的事情。如果你想让你的应用程序具有可移植性,就不要指望它在非posix平台上也能工作。

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