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

问题描述 投票:41回答:4

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

是几千次运行和time python foo.pytime python bar.py各自的平均值足以分析和比较他们的速度? 编辑:此外,如果每个程序的执行时间为亚秒(假设它不是上述),time仍然可以使用吗?

linux unix profiling benchmarking
4个回答
55
投票

time为基准测试产生足够长的时间,运行时间超过一秒,否则exec()ing过程所花费的时间可能比其运行时间大。

但是,在进行基准测试时,您应该注意上下文切换。也就是说,另一个进程可能正在使用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频率保持不变,以获得一致的结果。


42
投票

如今,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峰值显着下降,那么您做了正确的事情。


4
投票

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

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

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

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.