为了准确地进行基准测试,我应该制作一个大函数原子吗

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

本文关键字:一个 函数 我应该 基准测试      更新时间:2023-10-16

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

看到这篇关于基准测试的帖子,回答者说结果的粒度是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. 结果会准确吗?为了标记时间,我正在考虑使用安德烈亚斯·博尼尼的这个函数。

  2. 它会对我的电脑造成可怕的影响吗?可以说我迷信,但我认为问这个问题很好。


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

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

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

还有很多其他事情可能会改变算法的运行时间,比如几层CPU缓存、CPU的节能功能等。如果你真的只对非实时性问题的函数执行时间进行基准测试感兴趣,那么只需多次运行算法并获得执行时间的统计估计会更容易。

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

或者:你说你想知道算法对你的整个程序运行时间有什么影响?使用像callgrind(可集成到QtCreator中)这样的分析工具。