我正在运行 Ubuntu 18.04,对 Ubuntu 和 Linux 还不熟悉。我试图测量命令的执行时间,精确到毫秒。我还想将此时间附加到文件中,因为我在 for 循环中多次执行此操作。最后,我希望拥有最简单、最易读的语法。
长话短说:我希望/usr/bin/time
命令返回精确到毫秒的结果。
我读过其他提到时间格式环境变量的帖子,但从未提到如何修改它。
先谢谢您的帮助。
编辑 :考虑到所有答案,解决方案如下
#!/bin/bash
ts=$(date +%s%N)
command
echo "formatting $((($(date +%s%N) - $ts)/1000000)) formatting" >> file_to_append_time_to
答案1
该time
命令本身无法直接执行此操作。它确实以分数格式输出时间,因此可以通过乘以 1000 将其解析回毫秒:
$ time sleep 1s
> real 0m1.006s
$ echo '1.006 * 1000' | bc
> 1006.000
这意味着你能有点像通过以下方式执行命令:
{ time $@ ; } |& grep real | sed -E 's/[^0-9\.]+//g' | tr -d '\n' | (cat && echo " * 1000") | bc
这实际上是解析输出time
并将其乘以 1000。这很混乱,因为 bash。
可能更好/更有用的混乱是这个脚本用户 Infineight发布在 Stack Overflow:
#!/bin/bash
ts=$(date +%s%N)
$@
echo $((($(date +%s%N) - $ts)/1000000))
这个(我已经将其扩展以便于阅读)保存了当前的纳秒时间戳date
,运行命令,然后进行减法来计算经过的时间并将其格式化为毫秒。
在我的测试中,它们似乎都产生了相同的结果。
答案2
以毫秒为单位计算 Bash 脚本的运行时间:
start_time=$(date +%s%3N) # start time in milliseconds
sleep 1 # <-- code for measuring is here
end_time=$(date +%s%3N) # # end time in milliseconds
duration_ms=$((end_time - start_time)) # duration in milliseconds
echo "Execution time in ms: $duration_ms"
使用 bash 5.0.17 在 Ubuntu 20.04 上进行检查。
参考
在 Bash 上使用第 3 版,如上所述这里可能会出现以下问题:
使用 bash V3,$(date +%s%N) 命令将返回类似 1692824647N: 的内容,当您尝试计算不同的值时,最终会得到 1692824647N: 值对于基数错误来说太大。在 bash V4 中,这个问题已经解决,但如果您仍在使用 bash 3 并且想要克服这个问题,那么最好使用 GNU coreutils 中的 /usr/local/gnu/coreutils/bin/date 库。