使用 shell 测量性能

使用 shell 测量性能

如何减去时间并显示秒或毫秒?

  1. begin_time=$(date)
  2. 运行某些东西来(快速、简单和非正式)检查性能
  3. echo $(date) - $begin_time

当然不行,怎么办呢?

答案1

Bash 有一个内置函数用于此目的,称为time。只需将其添加到任何命令前面,它就会计算该命令运行所需的时间。有关更多信息,请参阅help time:)

[user@sol ~]$ time sleep 2

real    0m2.002s
user    0m0.002s
sys 0m0.000s

zsh 有一个类似的内置函数,也叫time,但没有 的帮助页面help time。以下是示例输出:

[sol ~]$ time sleep 2
sleep 2  0.00s user 0.00s system 0% cpu 2.003 total

答案2

除了time内置的之外,还有/usr/bin/time,它通常更有用。

walt@bat:~(0)$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.04elapsed 0%CPU (0avgtext+0avgdata 1756maxresident)k
80inputs+0outputs (1major+73minor)pagefaults 0swaps
walt@bat:~(0)$ /usr/bin/time -v sleep 2
    Command being timed: "sleep 2"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00
    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): 1828
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 73
    Voluntary context switches: 2
    Involuntary context switches: 0
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
walt@bat:~(0)$ 

或者,如果您确实想手动完成,请阅读man date并使用date +%s.%N(%s = 自纪元以来的秒数,%N = 纳秒)

答案3

如果您使用bashzshshell,并且只需要秒的分辨率,那么您可以使用它们的SECONDSshell 变量。来自man bash

SECONDS
       Each  time  this  parameter is referenced, the number of seconds
       since shell invocation is returned.  If a value is  assigned  to
       SECONDS,  the  value  returned upon subsequent references is the
       number of seconds since the assignment plus the value  assigned.

因此,如果您在执行命令(或命令序列)之前分配一个零值,则会为您完成减法。

前任。

$ SECONDS=0 && sleep 2 && echo $SECONDS
2

有趣的是,ksh93有一个SECONDS计时器,但它似乎提供毫秒级的分辨率:

$ ksh
$ SECONDS=0 && sleep 2 && echo $SECONDS
2.002

(Korn shell - 早于bashzsh- 通常能够处理非整数 shell 算术。)

答案4

修复代码

(假设你正在使用 Bash)

begin_time=$(date +%s)  # Get seconds since Unix epoch.
sleep 2  # For example
echo $(($(date +%s) - begin_time)) seconds

这应该输出2 seconds

(注意:通常你应该引用所有的扩展,但这些值保证是整数。)

代码有问题

begin_time= date
  • 要将命令的输出分配给变量,语法是variable=$(command)。按照您的编写方式,它将作为环境变量调用date-begin_time根本不是您想要的。
  • date的输出是特定于语言环境的。这就是我使用 Unix 时间的原因。
echo date - $(begin_time)
  • 这不是算术上下文,因此减号被视为字符串而不是运算符。使用$((expression))
  • 要获取命令的输出(命令替换),请使用$(command)
  • 要获取变量的值(参数替换),请使用$variable${variable}

相关内容