UNIX的“时间”命令对于基准testing是否足够准确?
假设我想要testing两个程序:foo.py和bar.py.
是几千运行和相应的time python foo.py
和time 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时没有其他重要的活动。