![外部命令“time”和保留字“time”时间可以表示什么?](https://linux22.com/image/85684/%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4%E2%80%9Ctime%E2%80%9D%E5%92%8C%E4%BF%9D%E7%95%99%E5%AD%97%E2%80%9Ctime%E2%80%9D%E6%97%B6%E9%97%B4%E5%8F%AF%E4%BB%A5%E8%A1%A8%E7%A4%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
Bash 参考手册说
使用
time
作为保留字允许 shell 内建函数、shell 函数和管道的计时。外部time
命令无法轻松地对这些进行计时。
外部命令可以
time
计时什么?只有简单的外部命令?没有其他的?
哪条规则阻止它计时其他事情?该规则属于 shell (bash) 还是外部命令的执行
time
?顺便说一句,我运行的是 Ubuntu,所以
time
来自 Debian。Bash 的保留字可以
time
为所有可以运行的东西计时吗?如果没有的话,什么时候不能呢?哪些是外部
time
可以计时而保留字time
不能计时的?
答案1
我的回答是关于Linux的。
- 哪条规则阻止它计时其他事情?
我想它会得到时间信息仅适用于进程,因为它实际上使用wait4
系统调用来获取此值时间信息。第一个参数wait4
是进程的pid。所以/usr/bin/time
总是打电话execve
然后等待4。
顺便一提:
execve() 执行文件名指向的程序。文件名必须是二进制可执行文件或以以下形式的行开头的脚本:#!解释器 [可选参数]
所以 /usr/bin/time 需要一些可以执行的东西execve
- Bash 的保留字时间可以为所有可以运行的东西计时吗?
我猜是。它作为两组调用来实现:
10:06:03 getrusage(RUSAGE_SELF, {ru_utime={0, 152976}, ru_stime={0, 465929}, ru_maxrss=4052, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=6214, ru_majflt=1, ru_nswap=0, ru_inblock=368, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=6349, ru_nivcsw=12}) = 0
10:06:03 getrusage(RUSAGE_CHILDREN, {ru_utime={2, 259656}, ru_stime={1, 888712}, ru_maxrss=21176, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=64297, ru_majflt=4, ru_nswap=0, ru_inblock=272, ru_oublock=368, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=56077, ru_nivcsw=386}) = 0
运行命令或内置命令
10:06:04 getrusage(RUSAGE_SELF, {ru_utime={0, 152976}, ru_stime={0, 476927}, ru_maxrss=4052, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=6243, ru_majflt=1, ru_nswap=0, ru_inblock=368, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=6399, ru_nivcsw=13}) = 0
10:06:04 getrusage(RUSAGE_CHILDREN, {ru_utime={2, 271654}, ru_stime={1, 903710}, ru_maxrss=21176, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=64514, ru_majflt=4, ru_nswap=0, ru_inblock=272, ru_oublock=368, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=56079, ru_nivcsw=406}) = 0
所以我想bash
只是计算差异并打印它。通过这种方式,它可以测量任何东西,例如自己的内置程序或子进程
- 哪些事情是外部时间可以计时而保留字时间不能计时的?
实际上都是系统调用getrusage
和wait4
从内核获取结构体用法。但是,bash time
从此结构中打印有限数量的字段。这是来自man 1 time
:
注意:某些 shell(例如 bash(1))具有内置的 time 命令,该命令提供的功能比此处描述的命令要少。
$/usr/bin/time -v seq 10000
Command being timed: "seq 10000"
User time (seconds): 0.01
System time (seconds): 0.01
Percent of CPU this job got: 24%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.12
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): 2640
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 199
Voluntary context switches: 8
Involuntary context switches: 24
Swaps: 0
File system inputs: 0
File system outputs: 8
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0