如何得到非常精确的运行时间c++
How get very precise elapsed time C++
我在Ubuntu上运行我的代码,我需要得到关于我的程序中一个函数的运行时间。我需要一个非常精确的时间,比如纳秒,或者至少是微秒。
我读到chrono.h
,但它使用系统时间,我更喜欢使用CPU时间。
是否有办法做到这一点,并有粒度(纳秒)?
std::chrono
确实有一个high_resolution_clock
,但请记住,精度受到处理器的限制。
时钟的可实现精度是不同硬件/操作系统的属性之一,它仍然泄漏到几乎所有语言中,并且,说实话,在相同的情况下,我发现自己构建一个在您的情况下足够好的抽象通常是唯一的选择。
话虽如此,我还是会避免使用STL来实现高精度定时。因为它是一个库标准,没有一个真正的实现,所以它必须创建一个抽象,这意味着:
- 使用最小公分母
- 通过平台相关行为泄漏硬件/操作系统细节
在第二种情况下,如果你想有统一的行为,你基本上回到了你开始的地方。如果您可以承受标准时钟可能的精度损失或偏差,那么请务必使用它。时钟是坚硬而微妙的。
如果你知道你的目标环境,你可以选择合适的时钟老式的方式(#ifdef PLATFORM_ID...
),例如clock_gettime()
, QPC
),并实现最精确的抽象,你可以得到。当然,您受到STL必须做出的相同选择的限制,但是通过减少平台集,您通常可以改进lcd需求。
如果你需要一种更理论化的方法来说服自己相信这个论证,你可以考虑一组具有最大精度的时钟,以及对当前时间的一系列访问。对于以均匀步长均匀前进的时钟,如果两次访问比一个时钟的最大精度快,但比另一个时钟的最大精度慢,则必然会得到不同的行为。另一方面,如果您确保两次访问至少是最慢时钟间隔的最大精度,则行为是相同的。当然,真实的时钟不是均匀前进的(时钟漂移),也不是单位步长。
虽然有一个标准函数应该返回CPU时间(std::clock
),但实际上没有可移植的方法来做到这一点。
在POSIX系统上(Linux正在尝试成为POSIX系统),那么std::clock
应该做正确的事情。如果你想让你的应用程序具有可移植性,就不要指望它在非posix平台上也能工作。
std::clock
返回的值也是近似,精度和分辨率取决于系统。
- KMP算法和LPS表构造的运行时间
- 如何计算Big-O表示法中的平均渐近运行时间
- 用时钟测量程序的运行时间
- 如何减少代码的运行时间以对齐文本?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 使用 Qt 测量过程的实际运行时间
- 如何执行用 C++ 编写的程序的运行时间?
- 无限运行时间
- 如何优化C++键值程序以获得更快的运行时间
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 重复值的最长运行时间
- 同一程序的运行时间差异很大,有时达到1000+us
- 测量 OpenCL 应用程序的运行时间
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- C 获得运行时间和内存使用量
- C DO插座关闭自己的运行时间
- 此代码中运行时间错误的原因是什么