4

我的目标是:我想测试一段代码(或函数)的性能,就像我在单元测试中测试该函数的正确性一样,假设这个基准测试过程的输出是“函数性能指标”这是“便携式”

我的问题是:我们通常通过使用计时器来计算代码执行期间经过的时间来对代码进行基准测试。并且该方法取决于硬件或O / S或其他东西。

我的问题是:是否有一种方法可以获得独立于主机性能(CPU/OS/等)的“功能性能指数”,或者如果不是“独立的”,可以说它与某些“相对”固定值。这样“功能性能指标”的值在任何平台或硬件性能上仍然有效。

例如:FPI 值可以在

  • 执行单个调用所需的算术指令数
  • 与基准函数相比的浮点值,例如函数 B 的评分指数为 1.345(即性能比基准函数慢 1.345 倍)
  • 或其他价值。

请注意,FPI 值不需要在科学上是正确的、准确的或准确的,我只需要一个值来粗略地概述该功能与通过相同方法测试的其他功能相比的性能。

4

5 回答 5

5

我认为你在这里寻找不可能的东西,因为现代计算机的性能是 CPU、缓存、内存控制器、内存等的复杂组合。

因此,一个(假设的)计算机系统可能会奖励使用巨大的查找表来简化算法,从而处理的 CPU 指令非常少。而另一个系统的内存相对于 CPU 内核可能要慢得多,因此会支持进行大量处理但触及很少内存的算法。

因此,这两种算法的单一“品质因数”甚至无法传达所有系统中哪个更好,更不用说它更好了。

于 2010-11-12T17:23:47.773 回答
2

可能您真正需要的是一个类似tcov的工具。

人 tcov说:

每个基本代码块(或如果指定了 tcov 的 -a 选项,则为每一行)以它已执行的次数为前缀;未执行的行以“#####”为前缀。基本块是没有分支的连续代码段:基本块中的每条语句都执行相同的次数。

于 2010-11-12T17:25:14.080 回答
1

不,没有这样的事情。不同的硬件性能不同。你可以有两段​​不同的代码 X 和 Y,这样硬件 A 运行 X 比 Y 快,但硬件 B 运行 Y 比 X 快。没有绝对的性能规模,它完全取决于硬件(更不用说其他事情了操作系统和其他环境因素)。

于 2010-11-12T17:22:03.380 回答
0

听起来你想要的是一个计算一段代码的Big-O 表示法的程序。我不知道是否有可能以自动化方式做到这一点(停止问题等)。

于 2010-11-12T18:19:40.693 回答
0

就像其他人提到的那样,这不是一项微不足道的任务,可能无法从中获得任何准确的结果。考虑几种方法:

  1. 基准函数——虽然这看起来很有希望,但我认为当您尝试比较不同类型的函数时,您会发现它不会很好地工作。例如,如果您的基准函数是 100% CPU 绑定(如在某些复杂的数学计算中),那么它将与其他 CPU 绑定函数进行比较/扩展,但与 I/O 或内存绑定函数相比时会失败。仔细地将基准函数与一小组类似函数进行匹配可能会起作用,但很乏味/耗时。
  2. 指令数——对于一个非常简单的处理器,可以计算每条指令的周期数并获得一个代码块将花费的总周期数的合理值,但是对于今天的现代处理器来说,这绝不是“简单”的。使用分支预测和并行流水线,您不能只是将指令周期相加并期望得到准确的结果。
  3. 手动计数——这可能是您最好的选择,虽然它不是自动的,但它可能比其他方法更快地提供更好的结果。只需查看代码的 O() 顺序、函数读取/写入的内存量、输入/输出的文件字节数等……通过为每个函数/模块提供一些这样的统计信息,您应该能够粗略比较它们的复杂性。
于 2010-11-12T20:32:57.687 回答