UNIX`time`命令对于基准测试是否足够准确?

时间:2012-01-25 16:52:09

标签: linux unix profiling benchmarking

假设我想对两个程序进行基准测试:foo.py和bar.py。

是否有几千次运行且time python foo.pytime python bar.py的平均值足以分析和比较它们的速度?


编辑:此外,如果每个程序的执行时间为亚秒(假设不是上述程序),那么time是否还可以使用?

4 个答案:

答案 0 :(得分:53)

对于运行时间超过1秒的基准测试,

time产生的时间足够长,否则exec()进程所花费的时间与其运行时相比可能会很大。

但是,在进行基准测试时,应注意上下文切换。也就是说,另一个进程可能正在使用CPU,从而与您的基准测试竞争CPU并增加其运行时间。为了避免与其他进程争用,您应该运行这样的基准:

sudo chrt -f 99 /usr/bin/time --verbose <benchmark>

或者

sudo chrt -f 99 perf stat -ddd <benchmark>

sudo chrt -f 99在优先级为99的FIFO实时类中运行您的基准测试,这使您的流程成为最优先的流程并避免上下文切换(您可以更改/etc/security/limits.conf以使其不需要使用实时优先级的特权进程)。

它还会使time报告所有可用的统计信息,包括基准测试产生的上下文切换次数,通常为0,否则您可能希望重新运行基准测试。

perf stat -ddd/usr/bin/time提供更多信息,并显示诸如每周期指令,分支和缓存未命中等信息。

最好禁用CPU频率缩放和增强,以便在基准测试期间CPU频率保持不变,以获得一致的结果。

答案 1 :(得分:41)

现在,imo,没有理由使用time进行基准测试。请改用perf stat。它为您提供了更多有用的信息,可以在任何给定的时间内重复基准测试过程,并对结果进行统计,即计算方差和平均值。这更加可靠,与time一样简单:

perf stat -r 10 -d <your app and arguments>

-r 10将运行您的应用10次并对其进行统计。 -d输出更多数据,例如缓存未命中。

因此虽然time对于长时间运行的应用程序可能足够可靠,但它肯定不如perf stat可靠。请改用它。

附录:如果你真的想继续使用time,至少不要使用bash-builtin命令,但实际处理的是详细模式:

/usr/bin/time -v <some command with arguments>

输出就是例如:

    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1968
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 93
    Voluntary context switches: 1
    Involuntary context switches: 2
    Swaps: 0
    File system inputs: 8
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

特别注意这是如何测量峰值RSS的,如果你想比较一个补丁对峰值内存消耗的影响,这通常就足够了。即使用该值进行比较之前/之后,如果RSS峰值显着下降,那么你就做对了。

答案 2 :(得分:4)

是的,time足够准确。而且你需要只运行你的程序十几次(假设运行持续时间超过一秒,或者很长一段时间 - 至少超过200毫秒)。当然,对于大多数运行(第一个除外),文件系统会很热(即小文件已经缓存在RAM中),所以请考虑到这一点。

你希望让time - d运行至少持续十分之几秒的原因是时间测量的准确性和粒度。不要指望不到百分之一秒的准确度。 (你需要一些特殊的内核选项让它有一毫秒)

从应用程序内部,您可以使用clockclock_gettimegettimeofdaygetrusagetimes(他们肯定有Python等价物。)

不要忘记阅读time(7)手册页。

答案 3 :(得分:2)

是。 time命令既给出了经过的时间,也给出了消耗的CPU。后者可能是你应该关注的,除非你做了很多I / O.如果经过的时间很重要,请确保在运行测试时系统没有其他重要活动。