Jer*_*emy 6 c++ testing performance
我正试图找到一种方法来测试一块C++代码运行需要多长时间.我用它来比较代码与不同的算法和不同的语言,所以理想情况下我想要一个秒/毫秒的时间.在Java中我使用的是这样的东西:
long startTime = System.currentTimeMillis();
function();
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法来获得像C++那样的准确时间(或者我应该使用其他一些基准测试手段)?
使用您平台上可用的最佳计数器,可以追溯到时间()以便于移植.我正在使用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
Run Code Online (Sandbox Code Playgroud)
如果您知道自己在做什么,清除缓存并设置线程关联性可以使您的测量更加稳健.
然而,这并非没有pifalls.测量越"稳定",它的现实性就越低.任何实现都会随时间变化很大,具体取决于数据状态和指令缓存.我在这里很懒,使用max =值来判断第一次运行惩罚,这可能不适合某些场景.
在Windows中,您可以使用高性能计数器来获得更准确的结果:
您可以使用该QueryPerformanceFrequency()函数获取每个seconde的高频率滴答数,以及用户QueryPerformanceCounter()想要计时的前后功能.
当然,这种方法不便携......
您是否考虑过实际使用分析器?Visual Studio Team System内置了一个,但还有其他可用的功能,如VTune和GlowCode.
| 归档时间: |
|
| 查看次数: |
15268 次 |
| 最近记录: |