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

Adl*_*l A 5 c++ benchmarking function

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

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;
}
Run Code Online (Sandbox Code Playgroud)

条件是F(a,b)== D(a,b)(对于相同的输入都返回相同的值).

如果你想对他们的表现进行基准测试,你会怎么做?更准确地说,你会如何孤立它需要执行时间F(A,B)d(A,B)等,它并不能反映它花费的时间在基准设置二次操作?

use*_*854 9

谷歌基准测试是最好的开源解决方案之一.您必须围绕要进行基准测试的代码创建简单的包装器,并静态或动态地与基准库lib链接.使用代码编写这样的微基准测试通常很有用.获得灵感,请参阅精彩的演示文稿.

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);
Run Code Online (Sandbox Code Playgroud)

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

另一种Linux特定的基准功能方法是使用perf工具.

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