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



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

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) 所需的时间,使其反映基准设置中其他辅助操作所需的时间?

最好的开源解决方案之一是Google Benchmark。

您必须围绕要进行基准测试的代码创建简单的包装器,并与基准库静态或动态链接。在代码附近编译此类微基准通常很有用。有关灵感,请参阅真棒演示文稿。

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,可以使用时间戳计数器。

但您应该知道,这种测量不会抵抗操作系统执行的任何上下文切换或跳转到 CPU 上。在这种情况下,您唯一的选择是使用具有单个执行流的算法。进入测试功能前记住CPU的ID和TSC值,测试功能后检查CPU的ID。然后计算TSC值之间的差异。您还可以为进程设置 CPU 关联,以将进程粘附到特定 CPU。

另一种特定于 Linux 的可能对函数进行基准测试的方法是使用 perf 工具。

但无论如何,任何测量都会给结果增加一些误差级别。

相关内容

  • 没有找到相关文章

最新更新