为了准确地对其进行基准测试,我应该使一个大函数成为原子吗?
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);
}
我尝试进行基准测试的函数不是短函数。
结果会准确吗?为了标记时间,我正在考虑使用 this function by Andreas Bonini.
它会不会对我的电脑造成严重影响?说我迷信,但我觉得问这个问题很好。
我在 Linux 内核上使用 C++11。
C++11 原子不是 RTOS 方式中的原子,它们只是在编写多线程代码时提供保证。 Linux 不是 RTOS。您的代码可以而且将始终被中断。虽然有一些方法可以减轻影响,但必须深入研究 linux.
例如,您可以配置 niceness 以减少被其他用户空间程序打断。您可以告诉内核在哪个 CPU 内核上处理中断,然后将您的程序固定到另一个 cpu。您可以提高计时器精度等,但是:
还有许多其他因素可能会改变您的算法的 运行 时间,例如多层 CPU 缓存、CPU 的节能功能等...如果你真的只对非硬实时问题的函数执行时间的基准测试感兴趣,只需多次 运行 算法并获得执行时间的统计估计会更容易。
- 在基准测试和平均期间调用该函数十亿次。或者
- 基准函数从1次到10亿次。您感兴趣的执行时间度量应该线性扩展。然后做一些线性回归来估计它。
OR:你说你想知道算法对你的总程序运行时间有什么影响?使用分析工具,如 callgrind
(可集成到 QtCreator)。
我想知道执行一些代码需要多长时间。我正在执行的代码处理 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);
}
我尝试进行基准测试的函数不是短函数。
结果会准确吗?为了标记时间,我正在考虑使用 this function by Andreas Bonini.
它会不会对我的电脑造成严重影响?说我迷信,但我觉得问这个问题很好。
我在 Linux 内核上使用 C++11。
C++11 原子不是 RTOS 方式中的原子,它们只是在编写多线程代码时提供保证。 Linux 不是 RTOS。您的代码可以而且将始终被中断。虽然有一些方法可以减轻影响,但必须深入研究 linux.
例如,您可以配置 niceness 以减少被其他用户空间程序打断。您可以告诉内核在哪个 CPU 内核上处理中断,然后将您的程序固定到另一个 cpu。您可以提高计时器精度等,但是:
还有许多其他因素可能会改变您的算法的 运行 时间,例如多层 CPU 缓存、CPU 的节能功能等...如果你真的只对非硬实时问题的函数执行时间的基准测试感兴趣,只需多次 运行 算法并获得执行时间的统计估计会更容易。
- 在基准测试和平均期间调用该函数十亿次。或者
- 基准函数从1次到10亿次。您感兴趣的执行时间度量应该线性扩展。然后做一些线性回归来估计它。
OR:你说你想知道算法对你的总程序运行时间有什么影响?使用分析工具,如 callgrind
(可集成到 QtCreator)。