2014-09-04 18 views
0

我试图分析一些功能,实现不同版本的相同的算法以不同的方式。我增加了每个函数的运行次数,以便在单个函数中花费的总时间大约为1分钟(以显示性能差异)。获取可靠的性能测量的短代码位

现在,运行多次测试会产生莫名其妙的结果。在同一个函数的几次执行之间存在巨大的变化(+ - 50%),并且因此确定哪个函数最快(这是测试的目标)几乎是不可能的。

在运行测试之前,我是否应该照顾一些特殊的东西,以便测量更平滑?如果没有,就是多次运行测试并计算每种功能的平均值。

+0

你是如何测量时间的?你使用'glibc'库来收集数据吗?你使用'clock_t'和/或'tms'结构吗?我研究了[测量时间的glibc手册](http://www.gnu.org/software/libc/manual/html_mono/libc.html#Date-and-Time)以了解您的问题,并希望确保您知道CPU时间和处理器时间测量。 – Bhaskar 2014-09-04 12:48:32

+0

@Bhaskar:我用'clock_t()'和'gettimeofday()'。不知道'tms',看着那个。 – michaelmeyer 2014-09-04 13:05:34

+0

'gettimeofday()'给你日历时间,并不是你想要的,IMO。日历和处理器时间就是你要找的东西,尽管我并没有完全理解它在多处理器设置中的差异。 – Bhaskar 2014-09-04 13:08:50

回答

2

有很多事情要检查!

首先,确保你的函数实际上是CPU绑定的。如果是这样,请确保在测试中禁用所有CPU节流,turbo模式和省电模式(在BIOS中)。如果您仍然遇到问题,请尝试将您的进程固定到单个核心。可能也禁用超线程。

所有这些的目标是确保您的代码在单个内核上运行时不会受到太多干扰。如果你在Linux上,你可以从可用内核的操作系统列表中删除单个内核,并使用它(所以不会对内核造成干扰)。

多次运行测试是个好主意,但使用平均值(算术平均值)不是。相反,请使用不受异常值影响的中值或最小值或其他度量值。通常,偶尔长时间的测试运行可能会被彻底抛出(除非你正在构建一个实时系统!)。

+0

不错!我正在记录和搜索硬件资料。 – michaelmeyer 2014-09-04 12:25:49