外部命令“time”和保留字“time”时间可以表示什么?

外部命令“time”和保留字“time”时间可以表示什么?

Bash 参考手册说

使用time作为保留字允许 shell 内建函数、shell 函数和管道的计时。外部time命令无法轻松地对这些进行计时。

  1. 外部命令可以time计时什么?

    只有简单的外部命令?没有其他的?

    哪条规则阻止它计时其他事情?该规则属于 shell (bash) 还是外部命令的执行time

    顺便说一句,我运行的是 Ubuntu,所以time来自 Debian。

  2. Bash 的保留字可以time为所有可以运行的东西计时吗?如果没有的话,什么时候不能呢?

  3. 哪些是外部time可以计时而保留字time不能计时的?

答案1

我的回答是关于Linux的。

  1. 哪条规则阻止它计时其他事情?

我想它会得到时间信息仅适用于进程,因为它实际上使用wait4系统调用来获取此值时间信息。第一个参数wait4是进程的pid。所以/usr/bin/time总是打电话execve然后等待4。

顺便一提:

execve() 执行文件名指向的程序。文件名必须是二进制可执行文件或以以下形式的行开头的脚本:#!解释器 [可选参数]

所以 /usr/bin/time 需要一些可以执行的东西execve

  1. 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只是计算差异并打印它。通过这种方式,它可以测量任何东西,例如自己的内置程序或子进程

  1. 哪些事情是外部时间可以计时而保留字时间不能计时的?

实际上都是系统调用getrusagewait4从内核获取结构体用法。但是,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

相关内容