假设我想对两个程序进行基准测试:foo.py和bar.py.
是几千次运行和time python foo.py
和time python bar.py
各自的平均值足以分析和比较他们的速度?
编辑:此外,如果每个程序的执行时间为亚秒(假设它不是上述),time
仍然可以使用吗?
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频率保持不变,以获得一致的结果。
如今,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峰值显着下降,那么您做了正确的事情。
是的,time
足够准确。而且你需要只运行你的程序十几次(假设运行持续时间超过一秒,或者很长一段时间 - 至少超过200毫秒)。当然,对于大多数运行(第一个除外),文件系统会很热(即小文件已经缓存在RAM中),因此请考虑到这一点。
你想让time
-d运行至少持续十分之几秒的原因是时间测量的准确性和粒度。不要指望不到百分之一秒的准确度。 (你需要一些特殊的内核选项让它一毫秒)
从应用程序内部,您可以使用clock,clock_gettime,gettimeofday,getrusage,times(它们肯定有Python等价物)。
不要忘记阅读time(7)手册页。
是。 time命令既给出了经过的时间,也给出了消耗的CPU。后者可能是你应该关注的,除非你做了很多I / O.如果经过的时间很重要,请确保在运行测试时系统没有其他重要活动。