这可能是一个更高级的问题。如果你有两个返回值的函数
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)所需的时间,使其不反映基准设置中其他二次操作所需的时间?
答案 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。
但无论如何,任何措施都会为结果添加一些错误级别。