我第一次深入研究 bash,并想尝试测试一些代码来比较实现相同目标的不同方法。作为其中的一部分,我遇到了记录代码运行时间的 time 和 times 方法。对于通过以下方式创建的简单的一行脚本:
echo "echo a script" > script
我得到:
$ time bash ./script
a script
real 0m0.009s
user 0m0.006s
sys 0m0.002s
$ times bash ./script
0m0.082s 0m0.074s
0m0.019s 0m0.041s
$ /usr/bin/time bash ./script
a script
0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 3328maxresident)k
0inputs+0outputs (0major+148minor)pagefaults 0swaps
$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
$ type -a times
times is a shell builtin
$ which -a time
/usr/bin/time
/bin/time
bash -c help
带我去:
$ help time
time: time [-p] pipeline
Report time consumed by pipeline's execution.
$ help times
times: times
Display process times.
并man time
给我:
TIME(1)........通用命令手册.........TIME(1)
NAME time - 运行程序并总结系统资源使用情况
bash shell 的用户需要使用显式路径才能运行外部时间命令,而不是 shell 内置变体。在时间安装在 /usr/bin 中的系统上,第一个示例将变为
/usr/bin/time wc /etc/hosts
bash 参考手册将其描述time
为保留字,“对 shell 有特殊含义。它们用于开始和结束 shell 的复合命令”,而将times
其描述为shell 内置命令,“继承自 Bourne Shell。这些命令按照 POSIX 标准的规定来实现”。
除了手册中的一句话:
使用时间作为保留字允许对 shell 内置函数、shell 函数和管道进行计时。外部时间命令无法轻松地对这些进行计时。
我看不出三个非常相似的命令的原因。
我应该使用哪一种来测试不同的方法并优化我的脚本?
times
(内置)times
- 按照help times
:强调“累积”和“对于 shell 及其所有子进程”。它不带任何参数,也不测量另一个命令的执行时间:它打印 shell 及其子级执行所花费的当前用户和系统时间。
例如,如果我想要
printf
空字符串一百万次,那么 shell 运行所有这些命令所需的时间将非常重要(重点关注注释行的第一个字段):time
这赋予了它与(保留字)和(可执行文件)完全不同的用途/usr/bin/time
。大多数时候(不是双关语),在脚本中,您将使用time
和/usr/bin/time
。time
(保留字)//usr/bin/time
(可执行文件)正如 @terdon 关键指出的那样,
time
以“可以通过 exec 函数系列访问”的方式实现的“实用程序”必须存在于符合 POSIX 标准的系统上1;仅此一点就证明了/usr/bin/time
except的存在time
。保留字和可执行文件之间最显着的区别是:
/usr/bin/time
.另请注意,一般来说,内置可执行文件的运行速度通常比外部可执行文件快。所以在实践中,至少在Ubuntu上,就单个命令而言,两者之间的区别主要归结为打印输出的格式。
使用保留字,您几乎没有可用的输出定制(基本上您可以使用默认格式和 POSIX 兼容格式进行打印),而使用可执行文件,您有更多的可用选项(请参阅 参考资料
man time
)。