基于一段独立于CPU性能的代码?

时间:2010-11-12 17:17:08

标签: c++ benchmarking performance measurement

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

我的问题是:我们通常使用计时器对代码进行基准测试,以计算执行该代码期间的已用时间。并且该方法取决于硬件或操作系统或其他东西。

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

例如:FPI值可以在

中测量
  • 执行单个呼叫所需的算术指令数
  • 浮点值与基准函数相比,例如函数B的评级指数为1.345(这是性能比基准函数慢1.345倍)
  • 或其他价值。

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

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你真正需要的是一个像 tcov 一样的工具。

man tcov 说:

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

答案 3 :(得分:0)

听起来你想要的是一个计算一段代码的Big-O Notation的程序。我不知道是否可以自动化方式(暂停问题等)。

答案 4 :(得分:0)

正如其他人所说,这不是一项微不足道的任务,可能无法从中得到任何准确的结果。考虑一些方法:

  1. 基准功能 - 虽然这看起来很有希望,但我认为您会发现,当您尝试比较不同类型的功能时,它将无法正常工作。例如,如果您的基准测试功能是100%CPU限制(如在一些复杂的数学计算中)那么它将与其他CPU绑定函数进行比较/缩放,但与I / O或内存绑定函数进行比较时会失败。将基准功能与一小组类似功能小心地匹配可能会起作用,但是很繁琐/耗时。
  2. 指令数 - 对于一个非常简单的处理器,可以计算每条指令的周期,并获得一个代码块所需的总周期数的合理值,但是今天的现代处理器绝不是“简单”。通过分支预测和并行流水线,您不仅可以添加指令周期,还可以获得准确的结果。
  3. 手动计数 - 这可能是您最好的选择,虽然它不是自动的,但它可能比其他方法更快地提供更好的结果。只需看看代码的O()顺序,函数读/写的内存量,输入/输出的文件字节数等等....通过为每个函数/模块设置一些这样的统计数据,你应该能够粗略地比较它们的复杂性。