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

标签 c++ performance testing

我正在尝试找到一种方法来测试运行一段 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/

相关文章:

java: ByteArrayOutputStream.toByteArray() 性能

java - 如何禁用未按下的按钮

eclipse - 在 Eclipse 中,如何从另一个具有依赖项的项目中排除一个 Maven 项目的测试文件夹?

c++ - 从内部类中的方法调用包含类的方法

c++ - Qt QList ASSERT在其他PC上安装后失败

C++ 非阻塞读取

php - PHP memory_limit 越多越好吗?

testing - QA 在需求收集阶段的作用是什么?

Django 使用额外的 GET 参数测试命名 URL

c++ - 如何在自定义对象的 << 运算符中添加自定义前缀