假设我想对两个程序进行基准测试:foo.py和bar.py。
是否有几千次运行且time python foo.py
和time python bar.py
的平均值足以分析和比较它们的速度?
编辑:此外,如果每个程序的执行时间为亚秒(假设不是上述程序),那么time
是否还可以使用?
答案 0 :(得分:53)
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运行至少持续十分之几秒的原因是时间测量的准确性和粒度。不要指望不到百分之一秒的准确度。 (你需要一些特殊的内核选项让它有一毫秒)
从应用程序内部,您可以使用clock,clock_gettime,gettimeofday, getrusage,times(他们肯定有Python等价物。)
不要忘记阅读time(7)手册页。
答案 3 :(得分:2)
是。 time命令既给出了经过的时间,也给出了消耗的CPU。后者可能是你应该关注的,除非你做了很多I / O.如果经过的时间很重要,请确保在运行测试时系统没有其他重要活动。