如何获得非常精确的经过时间 C++
How get very precise elapsed time C++
我是 运行 我在 Ubuntu 上的代码,我需要获取关于我程序中某个函数的运行时间。我需要一个非常准确的时间,比如纳秒或至少微秒。
我读到 chrono.h
但它使用系统时间,我更喜欢使用 CPU 时间。
有没有办法做到这一点,并且具有这种粒度(纳秒)?
std::chrono
确实有一个 high_resolution_clock
,但请记住精度受处理器限制。
如果你想使用 libc 中的函数目录,你可以使用 gettimeofday 但和以前一样,不能保证这将是纳秒级的精度。(这是只有微秒精度)
虽然有一个标准函数 应该 return CPU 时间 (std::clock
) 实际上没有可移植的方法这个。
在 POSIX 系统上(Linux 正在尝试)然后 std::clock
应该做正确的事情。如果您想让您的应用程序具有可移植性,请不要指望它在非 POSIX 平台上也能正常工作。
由 std::clock
编辑的值 return 也是 近似值 ,精度和分辨率取决于系统。
时钟的可实现精度是不同硬件的特性之一/OS 仍然渗透到几乎所有语言中,老实说,在同样的情况下,我发现自己建立了一个在您的情况下足够好的自己的抽象通常是唯一的选择。
也就是说,我会避免使用 STL 进行高精度计时。由于它是一个库标准,没有一个真正的实现,它必须创建一个抽象,这意味着以下之一:
- 使用最小公分母
- 通过依赖于平台的行为泄露hardware/OS细节
在第二种情况下,如果你想有统一的行为,你基本上回到了你开始的地方。如果您可以承受 标准 时钟可能出现的精度损失或偏差,那么一定要使用它。时钟坚硬而微妙。
如果你知道你的目标环境,你可以用老派的方式选择合适的时钟 (#ifdef PLATFORM_ID...
),例如clock_gettime()
, QPC
),并实现你可以获得的最精确的抽象。当然,您会受到 STL 必须做出的相同选择的限制,但通过减少平台集,您通常可以改进 lcd 要求。
如果您需要一种更理论化的方法来让自己相信这个论点,您可以考虑具有最大精度的时钟集,以及对当前时间的一系列访问。对于以均匀步长均匀推进的时钟,如果两次访问发生的速度快于一个时钟的最大精度,但又慢于另一个时钟的最大精度,您一定会得到不同的行为。另一方面,如果您确保两次访问至少是最慢时钟的最大精度,则行为是相同的。当然现在真正的时钟不是均匀前进的(时钟漂移),也不是单位步长。
我是 运行 我在 Ubuntu 上的代码,我需要获取关于我程序中某个函数的运行时间。我需要一个非常准确的时间,比如纳秒或至少微秒。
我读到 chrono.h
但它使用系统时间,我更喜欢使用 CPU 时间。
有没有办法做到这一点,并且具有这种粒度(纳秒)?
std::chrono
确实有一个 high_resolution_clock
,但请记住精度受处理器限制。
如果你想使用 libc 中的函数目录,你可以使用 gettimeofday 但和以前一样,不能保证这将是纳秒级的精度。(这是只有微秒精度)
虽然有一个标准函数 应该 return CPU 时间 (std::clock
) 实际上没有可移植的方法这个。
在 POSIX 系统上(Linux 正在尝试)然后 std::clock
应该做正确的事情。如果您想让您的应用程序具有可移植性,请不要指望它在非 POSIX 平台上也能正常工作。
由 std::clock
编辑的值 return 也是 近似值 ,精度和分辨率取决于系统。
时钟的可实现精度是不同硬件的特性之一/OS 仍然渗透到几乎所有语言中,老实说,在同样的情况下,我发现自己建立了一个在您的情况下足够好的自己的抽象通常是唯一的选择。
也就是说,我会避免使用 STL 进行高精度计时。由于它是一个库标准,没有一个真正的实现,它必须创建一个抽象,这意味着以下之一:
- 使用最小公分母
- 通过依赖于平台的行为泄露hardware/OS细节
在第二种情况下,如果你想有统一的行为,你基本上回到了你开始的地方。如果您可以承受 标准 时钟可能出现的精度损失或偏差,那么一定要使用它。时钟坚硬而微妙。
如果你知道你的目标环境,你可以用老派的方式选择合适的时钟 (#ifdef PLATFORM_ID...
),例如clock_gettime()
, QPC
),并实现你可以获得的最精确的抽象。当然,您会受到 STL 必须做出的相同选择的限制,但通过减少平台集,您通常可以改进 lcd 要求。
如果您需要一种更理论化的方法来让自己相信这个论点,您可以考虑具有最大精度的时钟集,以及对当前时间的一系列访问。对于以均匀步长均匀推进的时钟,如果两次访问发生的速度快于一个时钟的最大精度,但又慢于另一个时钟的最大精度,您一定会得到不同的行为。另一方面,如果您确保两次访问至少是最慢时钟的最大精度,则行为是相同的。当然现在真正的时钟不是均匀前进的(时钟漂移),也不是单位步长。