UNIX的“时间”命令对于基准testing是否足够准确?

假设我想要testing两个程序:foo.py和bar.py.

是几千运行和相应的time python foo.pytime python bar.py足够足够的分析和比较他们的速度?

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

对于运行时间超过一秒的基准, time会产生足够好的时间,否则exec()一个进程的时间可能比运行时间要大。

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

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

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

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

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

如今,没有理由利用time进行基准testing。 改用perf stat 。 它给了你更多有用的信息,并可以在任何给定的时间内重复基准testing过程,并对结果进行统计,即计算方差和平均值。 这更可靠,而且和使用time一样简单:

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

-r 10将运行您的应用程序10次,并对其进行统计。 -d输出一些更多的数据,如caching未命中。

所以虽然time对于长时间运行的应用程序来说可能足够可靠,但它绝对不像perf stat那样可靠。 改用它。

附录:如果你真的想继续使用time ,至less不要使用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峰值有显着的下降,那么你做了一些正确的事情。

是的, time是足够准确的。 而且你只需要运行十几倍的程序(假如运行时间超过一秒钟,或者是一秒钟的一小部分 – 至less200毫秒以上)。 当然,对于大多数运行(除第一个之外),文件系统会很热(即,小文件已经被caching在RAM中),所以考虑到这一点。

你想要有time的原因至less要持续十几秒,这是时间测量的准确度和粒度。 不要期望小于百分之一秒的准确性。 (你需要一些特殊的内核选项,让它有一毫秒)

从应用程序内部,你可以使用clock , clock_gettime , gettimeofday , getrusage , times (它们肯定有一个Python等价物)。

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

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