对纯 C++ 函数进行基准测试

Benchmarking a pure C++ function

如何防止 GCC/Clang 内联和优化纯函数的多次调用?

我正在尝试对这种形式的代码进行基准测试

int __attribute__ ((noinline)) my_loop(int const* array, int len) {
   // Use array to compute result.
 }

我的基准代码看起来像这样:

int main() {
  const int number = 2048;
   // My own aligned_malloc implementation.
  int* input = (int*)aligned_malloc(sizeof(int) * number, 32);
  // Fill the array with some random numbers.
  make_random(input, number);
  const int num_runs = 10000000;
  for (int i = 0; i < num_runs; i++) {
     const int result = my_loop(input, number); // Call pure function.
  }
  // Since the program exits I don't free input.
}

正如预期的那样,Clang 似乎能够将其变成 O2 的空操作(甚至可能在 O1)。

我尝试对我的实施进行实际基准测试的几件事是:

是否有一种规范的方法可以防止 Clang/GCC 优化此结果。也许用编译指示什么的?如果这个理想的方法跨编译器工作,加分。

您可以将指令直接插入到程序集中。我有时会使用宏来拆分程序集,例如将负载与计算和分支分开。

#define GCC_SPLIT_BLOCK(str)  __asm__( "//\n\t// " str "\n\t//\n" );

然后在源代码中插入

GCC_SPLIT_BLOCK("Keep this please")

函数前后