我想知道执行一些代码需要多长时间。我正在执行的代码处理openCV矩阵和操作。代码将在Linux上的ROS环境中运行。在基准测试期间,我不希望代码被系统函数中断。
关于基准测试this post,回答者说结果的粒度是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);
}
我试图进行基准测试的功能不是一个简短的功能。
结果是否准确?用于标记我正在考虑使用this function by Andreas Bonini的时间。
它会给我的电脑做些什么吗?叫我迷信,但我觉得提出这个问题很好。
我在Linux内核上使用C ++ 11。
答案 0 :(得分:1)
C ++ 11原子在RTOS方式中不是原子的,它们只是在编写多线程代码时提供保证。 Linux不是RTOS。您的代码可以并且将始终被中断。虽然有一些方法可以减轻这种影响,但并非没有深入研究linux。
例如,您可以配置niceness以减少其他用户空间程序的中断。您可以告诉内核哪个CPU内核处理中断,然后将程序固定到不同的CPU。您可以增加计时器精度等,但是:
还有许多其他因素可能会改变算法的运行时间,比如几层CPU缓存,CPU的省电功能等等......如果你真的只想对你的函数的执行时间进行基准测试 - 实时性问题,只需多次运行算法并获得执行时间的统计估算就更容易了。
或者:你说你想知道算法对你的整个程序运行时有什么影响?使用callgrind
等分析工具(可集成到QtCreator中)。