Unix中time命令的开销

8
我想知道在Unix中使用time命令会带来多少额外开销。我知道如何使用它,但我想知道该命令的执行时间会比原本执行时间长多少。
$ time java HelloWorld

打开终端,输入命令

$ java HelloWorld

我特别关注的是这种开销如何随着正在运行的程序的时间长度而变化。

背景: 我正在使用它来测量用Java编写的一堆长时间运行的实验所需的时间。


对于 zsh,在不带参数的情况下运行 time 只需要 0.07s。开销微乎其微。 - Blender
2个回答

16

根据源代码,额外的开销是固定的,并且仅仅由于正在启动一个额外进程(time 进程本身),从而引入了一小部分额外处理 (a)。通常情况下,shell 会启动您的程序,但在这种情况下,shell 启动了 timefork

这种额外处理包括:

  • 参数处理。
  • forkexec 子进程所需的时间。

在被测量的进程运行时,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),即使是这个小开销也会消失。


1
“time” 实际上是一个 shell 内置命令 - 至少在 Bash 中是这样,也许在其他 shell 中也是。 - ephemient
2
time time不是更准确地了解它的影响吗? - kojiro
可以安全地假设,不断启动其他进程的进程也不会受到影响吗?例如,当 ocrmypdf 对 PDF 文档进行 OCR 时,为每个页面创建一个 tesseract 进程。 - Adam Plocher
1
@Adam,启动进程有一个非零(但通常很小)的成本。对于 time 来说,这基本上是无关紧要的,因为它只启动了 一个 进程,而且通常是相对长寿的。如果你有一个进程每秒启动一千个其他进程,你很可能会看到影响。这就是为什么在 bash 中使用 while read 循环逐行处理输入(使用外部进程)通常比启动单个 sed/awk/perl 来处理整个输入流慢的原因。 - paxdiablo

3

time的开销应该是相当稳定的,不管被计时的程序如何。它所要做的就是取一个时间戳,运行程序,再取一个时间戳并输出结果。

关于准确性等问题:你运行的程序越短,time对其的影响就越大。例如,在“Hello World”上运行时间可能不会给出好的结果。在运行一段时间较长的程序时,time将非常准确,因为它的开销将占据噪音的很小部分。


是的...我确实读到了其他关于time命令的噪音问题的提问,就像我说的,我正在使用它来测量用Java编写的几个长时间运行的实验的时间。我只是想确保time命令本身不会增加已经长时间运行的程序的时间。感谢您的回答! - vijay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接