我正在尝试找到一种方法来测试运行一段 C++ 代码需要多长时间。我用它来比较不同算法和不同语言下的代码,所以理想情况下我想要以秒/毫秒为单位的时间。在 Java 中,我使用的是这样的东西:
long startTime = System.currentTimeMillis();
function();
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
有没有像 C++ 那样获得准确时间的好方法(或者我应该使用其他基准测试方法)?
最佳答案
使用您平台上可用的最佳计数器,回退到 time() 以实现可移植性。 我正在使用 QueryPerformanceCounter,但请参阅其他回复中的评论。
一般建议:
内部循环 应至少以时钟分辨率的 20 倍运行,以使分辨率误差 < 5%。 (所以,当使用 time() 时,你的内部循环应该至少运行 20 秒)
重复这些测量,看它们是否一致。
我使用额外的外循环,运行十次,并忽略最快和最慢的测量来计算平均值和偏差。比较两种实现时,偏差会派上用场:如果您有一种算法采用 2.0ms +/-.5,而另一种算法采用 2.2 +/- .5,则将其中一种称为“更快”的差异并不显着。 (仍应显示最大值和最小值)。所以恕我直言,有效的性能测量应该是这样的:
10000 x 2.0 +/- 0.2 ms (min = 1.2, , max=12.6), 10 repetitions
如果您知道自己在做什么,清除缓存和设置线程亲和性可以使您的测量更加稳健。
然而,这并非没有缺陷。测量越“稳定”,它就越不真实。任何实现都会随时间发生很大变化,具体取决于数据和指令缓存的状态。这里偷懒了,用max=的值来判断first run penalty,有些场景可能不够用。
关于c++ - 测试 C++ 应用程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795827/