您将如何对函数的性能进行基准测试?
How would you benchmark the performance of a function?
这可能是一个更高级的问题。如果你有两个函数 return 一个值,
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)(对于相同的输入,return 的值相同)。
如果您想对他们的表现进行基准测试,您会怎么做?
更准确地说,您将如何隔离执行 F(a,b) 或 D(a,b) 所需的时间不反映基准设置中其他辅助操作所花费的时间?
可用的最佳开源解决方案之一是 Google Benchmark。
您必须围绕要进行基准测试的代码创建简单的包装器,并且 link 使用基准库静态或动态地创建包装器。在您的代码附近编译此类微基准通常很有用。如需灵感,请参阅 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 执行的任何上下文切换或跳转 CPUs。在这种情况下,您唯一的选择是使用具有单一执行流程的算法。进入测试函数前记住CPU的ID和TSC值,进入测试函数后查看CPU的ID。然后计算 TSC 值之间的差异。您还可以为您的流程设置 CPU 亲和力,以将流程坚持到特定的 CPU。
另一种 Linux 特定的基准函数可能方法是使用 perf tool.
但无论如何,任何测量都会给结果增加一些误差。
这可能是一个更高级的问题。如果你有两个函数 return 一个值,
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)(对于相同的输入,return 的值相同)。
如果您想对他们的表现进行基准测试,您会怎么做? 更准确地说,您将如何隔离执行 F(a,b) 或 D(a,b) 所需的时间不反映基准设置中其他辅助操作所花费的时间?
可用的最佳开源解决方案之一是 Google Benchmark。
您必须围绕要进行基准测试的代码创建简单的包装器,并且 link 使用基准库静态或动态地创建包装器。在您的代码附近编译此类微基准通常很有用。如需灵感,请参阅 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 执行的任何上下文切换或跳转 CPUs。在这种情况下,您唯一的选择是使用具有单一执行流程的算法。进入测试函数前记住CPU的ID和TSC值,进入测试函数后查看CPU的ID。然后计算 TSC 值之间的差异。您还可以为您的流程设置 CPU 亲和力,以将流程坚持到特定的 CPU。
另一种 Linux 特定的基准函数可能方法是使用 perf tool.
但无论如何,任何测量都会给结果增加一些误差。