为了准确地对其进行基准测试,我应该使一个大函数成为原子吗?

Should I make a large function atomic in order to benchmark it accurately?

我想知道执行一些代码需要多长时间。我正在执行的代码处理 openCV 矩阵和操作。在 Linux 上的 ROS 环境中,代码将是 运行。我不希望代码在基准测试期间被系统功能中断。

this post关于benchmarking,回答者说结果的粒度是15ms。我想做得比这更好,所以我正在考虑使函数成为原子函数(仅用于基准测试目的)。由于某些原因,我不确定这是否是个好主意,主要是因为我对处理器架构没有深入的了解。


void atomic_wrapper_function(const object& A, const object& B) {
  static unsigned long running_sum = 0;
  unsigned long before, after;
  before = GetTimeMs64();
  function_to_benchmark(A, B);
  after = GetTimeMs64();
  running_sum += (after - before);
}

我尝试进行基准测试的函数不是短函数。

  1. 结果会准确吗?为了标记时间,我正在考虑使用 this function by Andreas Bonini.

  2. 它会不会对我的电脑造成严重影响?说我迷信,但我觉得问这个问题很好。


我在 Linux 内核上使用 C++11。

C++11 原子不是 RTOS 方式中的原子,它们只是在编写多线程代码时提供保证。 Linux 不是 RTOS。您的代码可以而且将始终被中断。虽然有一些方法可以减轻影响,但必须深入研究 linux.

例如,您可以配置 niceness 以减少被其他用户空间程序打断。您可以告诉内核在哪个 CPU 内核上处理中断,然后将您的程序固定到另一个 cpu。您可以提高计时器精度等,但是:

还有许多其他因素可能会改变您的算法的 运行 时间,例如多层 CPU 缓存、CPU 的节能功能等...如果你真的只对非硬实时问题的函数执行时间的基准测试感兴趣,只需多次 运行 算法并获得执行时间的统计估计会更容易。

  1. 在基准测试和平均期间调用该函数十亿次。或者
  2. 基准函数从1次到10亿次。您感兴趣的执行时间度量应该线性扩展。然后做一些线性回归来估计它。

OR:你说你想知道算法对你的总程序运行时间有什么影响?使用分析工具,如 callgrind(可集成到 QtCreator)。