以毫秒为单位测量命令的执行时间

以毫秒为单位测量命令的执行时间

我正在运行 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 库。

相关内容