如何减去时间并显示秒或毫秒?
begin_time=$(date)
- 运行某些东西来(快速、简单和非正式)检查性能
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
如果您使用bash
或zsh
shell,并且只需要秒的分辨率,那么您可以使用它们的SECONDS
shell 变量。来自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 - 早于bash
和zsh
- 通常能够处理非整数 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}
。