测试C++应用程序的性能

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++那样的准确时间(或者我应该使用其他一些基准测试手段)?

pet*_*hen 9

使用您平台上可用的最佳计数器,可以追溯到时间()以便于移植.我正在使用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 =值来判断第一次运行惩罚,这可能不适合某些场景.


S.L*_*ott 8

执行该功能几千次以获得准确的测量.

单个测量可能由OS事件或其他随机噪声主导.


Mar*_*ner 5

在Windows中,您可以使用高性能计数器来获得更准确的结果:

您可以使用该QueryPerformanceFrequency()函数获取每个seconde的高频率滴答数,以及用户QueryPerformanceCounter()想要计时的前后功能.

当然,这种方法不便携......


rlb*_*ond 5

您是否考虑过实际使用分析器?Visual Studio Team System内置了一个,但还有其他可用的功能,如VTune和GlowCode.

另请参见什么是适用于Windows的最佳免费C++探查器?

  • Profilers很适合回答"我的程序中最慢的部分是什么?"的问题.但通常不太擅长回答"我的节目有多慢?"这个问题.准确. (4认同)