编写小型基准测试

Writing small benchmark tests

我要买一台新电脑。太好了,但我想知道它的速度有多快。
现在我可以使用已经建立的基准 - 但我想了解为什么它更快。

所以我的想法是:
1. 编写小型基准测试非常具体的东西
2. 编译两次 -march=native
3. 简介和比较

现在我只需要提出基准:
- GB 范围内的 memcpy()、memset() 和 memchr() 以测试 RAM 速度
- 用于测试 SIMD 指令的矢量(或矩阵)运算
- 暴力破解平方根以测试一般指令速度和流水线
- 简单的算法(x[i]++ 或其他)来测试缓存 - 用 2,3 和 4 个不同值的模式填充数组。
对于每个不同的值(一项测试使用 if/else,一项测试使用开关)做一些小的事情。
那应该测试分支预测器。

我错过了一个功能吗?这些基准中的任何一个都可以简化吗?是否有 other/better 项针对我认为已经涵盖的 CPU 功能的测试?

Now I just need to come up with benchmarks:

"just" :-)。为人们编写基准来比较计算机实际上是一个有利可图的行业。它与琐碎的 FAR 相去甚远。即使是专业人士也会编写愚蠢的基准。有关商业提供商的一些示例,请搜索 SPEC、Geekbench、EEMBC...它们花费很多钱。

即使是这些由所谓的专家编写的基准测试,在提供您可以作为工程师进行交流的合理结果方面也常常是荒谬的(营销人员做得更好)。现代机器(我避免使用 "CPU" 这个词,因为这只是其中的一小部分,你有内存、互连、磁盘、驱动程序、操作系统......)真的很难在微型计算机上推理像你建议的优化级别。通过这些简单的测试,您可能会对您的两台计算机有一些直觉,但这远不是好的数据。

我能推荐的最好的是 运行 编译器基准套件。 LLVM 有一个 test-suite 项目,其中有各种基准测试,您可以 运行 了解您的新计算机有多好。我确定 GCC 会有类似的东西,我只是不熟悉它。 运行ning 测试套件的说明是 here.

即使是比您自己能够创建的测试套件大得多的测试套件,也需要大量的统计数据。性能对比充满惊喜,太容易出错了

现在,回答 为什么 计算机 A 比 B 在这些特定基准测试 上更快(或更慢)可能从微不足道到不可能。琐碎的情况可能是更多的寄存器或更多的缓存(以及明智地使用缓存的程序),不可能的是对 foobaddybar 的一些更改,制造商不会发布其详细信息,您将只能猜测。

所以,抱歉,这样的 "obvious" 测试会告诉您很多关于现代机器的有趣信息的日子已经一去不复返了。您需要使用非常严格的统计数据和基础架构才能获得半合理的结果。