我想知道在 unix 中使用 time 命令的开销是多少。
我知道如何使用它,但我想知道命令多长时间
$ time java HelloWorld
使用终端,而不是命令
$ java HelloWorld
我特别感兴趣的是这种开销如何随着正在运行的程序的持续时间而变化。
context:: 我用它来测量用 Java 编写的一系列长时间运行的实验所花费的时间。
我想知道在 unix 中使用 time 命令的开销是多少。
我知道如何使用它,但我想知道命令多长时间
$ time java HelloWorld
使用终端,而不是命令
$ java HelloWorld
我特别感兴趣的是这种开销如何随着正在运行的程序的持续时间而变化。
context:: 我用它来测量用 Java 编写的一系列长时间运行的实验所花费的时间。
开销是固定的,根据源代码,只是由于正在启动一个额外的进程(time
进程本身),引入了少量的额外处理(a)。通常,shell 会启动您的程序,但在这种情况下,shell 会启动time
并time
启动您的进程(带有fork
)。
这种额外的处理包括:
fork
和exec
孩子。当被测量的进程正在运行时,time
它本身只是在等待它退出(通过wait
调用),因此对进程没有影响。
因此,虽然过程的启动时间time
实际上包含在测量中,但这些仅对非常短的过程很重要。如果您的流程运行了相当长的时间,那么开销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
内置的外壳(例如bash
带有time
保留字),那么即使是很小的开销也会消失。
无论程序是否定时,开销都time
应该是相当恒定的。它所要做的就是获取一个时间戳,运行程序,获取另一个时间戳并输出结果。
在准确性等方面:您运行的程序越短,对它的影响time
就越大。例如,在“Hello World”上的时间可能不会给你带来好的结果。运行一段时间的时间将非常准确,因为时间的开销将大大降低。