我想知道在Unix中使用time命令会带来多少额外开销。我知道如何使用它,但我想知道该命令的执行时间会比原本执行时间长多少。
$ time java HelloWorld
打开终端,输入命令
$ java HelloWorld
我特别关注的是这种开销如何随着正在运行的程序的时间长度而变化。
背景: 我正在使用它来测量用Java编写的一堆长时间运行的实验所需的时间。
$ time java HelloWorld
打开终端,输入命令
$ java HelloWorld
我特别关注的是这种开销如何随着正在运行的程序的时间长度而变化。
背景: 我正在使用它来测量用Java编写的一堆长时间运行的实验所需的时间。
根据源代码,额外的开销是固定的,并且仅仅由于正在启动一个额外进程(time
进程本身),从而引入了一小部分额外处理 (a)。通常情况下,shell 会启动您的程序,但在这种情况下,shell 启动了 time
和 fork
。
这种额外处理包括:
fork
和 exec
子进程所需的时间。在被测量的进程运行时,time
只是等待它退出(使用 wait
调用),因此对该进程没有影响。
因此,尽管 time
进程的启动时间实际上包含在测量中,但这些只对非常短的进程才重要。如果您的进程运行了相当长的时间,则 time
的开销是无关紧要的。
至于我所说的“相当长的时间”,您可以通过使用非常快的可执行文件运行它,并查看它是否会增加更长时间运行的进程的开销:
pax> time sleep 0
real 0m0.001s
user 0m0.000s
sys 0m0.000s
pax> time sleep 1
real 0m1.001s
user 0m0.000s
sys 0m0.000s
pax> time sleep 10
real 0m10.001s
user 0m0.000s
sys 0m0.004s
pax> time sleep 100
real 1m40.001s
user 0m0.000s
sys 0m0.000s
换句话说,几乎没有任何影响。
现在,由于只有在长时间运行的过程中才会计时(除非您连续运行一个进程一两毫秒不关心,否则很难关心,此时有更好的方法来提高性能),time
的固定开销变得越来越不重要。
(a):而且,如果您使用具有内置 time
的 shell(例如 bash
带有其保留字 time
),即使是这个小开销也会消失。
time time
不是更准确地了解它的影响吗? - kojirotime
来说,这基本上是无关紧要的,因为它只启动了 一个 进程,而且通常是相对长寿的。如果你有一个进程每秒启动一千个其他进程,你很可能会看到影响。这就是为什么在 bash
中使用 while read
循环逐行处理输入(使用外部进程)通常比启动单个 sed/awk/perl
来处理整个输入流慢的原因。 - paxdiablotime
的开销应该是相当稳定的,不管被计时的程序如何。它所要做的就是取一个时间戳,运行程序,再取一个时间戳并输出结果。
关于准确性等问题:你运行的程序越短,time
对其的影响就越大。例如,在“Hello World”上运行时间可能不会给出好的结果。在运行一段时间较长的程序时,time
将非常准确,因为它的开销将占据噪音的很小部分。
zsh
,在不带参数的情况下运行time
只需要0.07s
。开销微乎其微。 - Blender