为了准确地进行基准测试,我应该制作一个大函数原子吗
Should I make a large function atomic in order to benchmark it accurately?
我想知道执行某些代码需要多长时间。我正在执行的代码处理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);
}
我试图做基准的函数不是一个简短的函数。
结果会准确吗?为了标记时间,我正在考虑使用安德烈亚斯·博尼尼的这个函数。
它会对我的电脑造成可怕的影响吗?可以说我迷信,但我认为问这个问题很好。
我在Linux内核上使用C++11。
C++11原子在RTOS方式中不是原子,它们只是在编写多线程代码时提供保证。Linux不是RTOS。您的代码可以并且将永远被中断。虽然有一些方法可以减轻这种影响,但也必须深入到linux中。
例如,您可以配置nicess以减少被其他用户空间程序中断的次数。您可以告诉内核在哪个CPU内核上处理中断,然后将程序固定到不同的CPU上。你可以提高计时器的精度等,但是:
还有很多其他事情可能会改变算法的运行时间,比如几层CPU缓存、CPU的节能功能等。如果你真的只对非实时性问题的函数执行时间进行基准测试感兴趣,那么只需多次运行算法并获得执行时间的统计估计会更容易。
- 在基准测试和平均值期间调用函数十亿次。或
- 对函数进行基准测试,从1次到10亿次。您感兴趣的执行时间度量应该是线性的。然后做一些线性回归,得到一个估计
或者:你说你想知道算法对你的整个程序运行时间有什么影响?使用像callgrind
(可集成到QtCreator中)这样的分析工具。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何仅为一个函数添加延迟
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我需要将多个函数组合为一个函数
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 将 N-arg 函数包装到另一个函数中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- C++从另一个函数退出函数
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 视觉我希望一个函数在另一个函数C++中进行计算
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在另一个函数 (c++) 中调用变量
- 如何在另一个函数中使用返回值作为参数?
- 如何包装一个函数以适应另一个函数的所需类型
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针