您将如何对功能的性能进行基准测试

时间:2016-03-01 14:04:50

标签: c++ function benchmarking

这可能是一个更高级的问题。如果你有两个返回值的函数

int F(int input1, int input2)
{
    int output;
    //some algorithm that assigns value to output//
    return output;
}

int D(int input1, int input2)
{
    int output;
    //another algorithm that assigns value to output//
    return output;
}

条件是 F(a,b)== D(a,b)(两者都返回相同输入的相同值)。

如果你想对他们的表现进行基准测试,你会怎么做? 更准确地说,您如何隔离执行 F(a,b) D(a,b)所需的时间,使其反映基准设置中其他二次操作所需的时间?

1 个答案:

答案 0 :(得分:9)

最好的开源解决方案之一是google benchmark。 您必须围绕要进行基准测试的代码创建简单的包装器,并静态或动态地链接到基准测试库。使用代码编写这样的微基准测试通常很有用。如需灵感,请参阅awesome presentation

static void BM_F(benchmark::State& state) {
  const auto input1 = state.range_x();
  const auto input2 = state.range_y();

  while (state.KeepRunning()) F(input1, input2);
}

static void BM_D(benchmark::State& state) {
  const auto input1 = state.range_x();
  const auto input2 = state.range_y();

  while (state.KeepRunning()) D(input1, input2);
}

BENCHMARK(BM_F)
    ->ArgPair(1, 10)
    ->ArgPair(10, 100)
    ->ArgPair(100, 1000);

BENCHMARK(BM_D)
    ->ArgPair(1, 10)
    ->ArgPair(10, 100)
    ->ArgPair(100, 1000);

如果要测量原始CPU周期,那么您唯一的选择是使用直接CPU指令。对于x86,您可以使用Time Stamp Counter。但是你应该知道,这样的测量不会抵抗OS执行的任何上下文切换或跳过CPU。在这种情况下你唯一的选择是使用algo单一执行流程,在进入测试功能之前记住CPU的ID和TSC值,并在测试功能后检查CPU的ID。然后计算TSC值之间的差异。您还可以为进程设置CPU关联,以将进程固定到特定的CPU。

另一种Linux特定的基准功能可能方法是使用perf tool

但无论如何,任何措施都会为结果添加一些错误级别。