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

我正在使用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使用>将命令的输出写入文件,使用>>将其追加到文件中(而不是覆盖它)。你有没有看过文档?man time告诉你:“*程序的执行时间与原子收集不一致;因此,在奇怪的情况下...*”,这意味着我怀疑你对它的要求超出了它能够准确提供的范围(或者应该被信任的范围)。它还有示例,或者尝试一下info time,其中包含更多信息和示例!你试过自己找吗? - guiverc
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上发布的脚本posted on Stack Overflow
#!/bin/bash
ts=$(date +%s%N)
$@
echo $((($(date +%s%N) - $ts)/1000000))

这个(我已经扩展了它以便更易读)保存了当前纳秒级时间戳从date,运行命令,然后进行减法计算来计算经过的时间,并将其格式化为毫秒。
在我的测试中,它们似乎都产生了相同的结果。

1你在答案中使用的time命令是bash内置的那个。问题特别指的是/usr/bin/time命令,它是不同的。不过我还是给你点赞了,因为我喜欢你提供的其他解决方案。 - Doug Smythies
谢谢 @DougSmythies,这两者有什么区别?我很好奇。再次感谢。 - Kristopher Ives
也许这个链接可以帮到你。我还记得是因为我也被它抓住过很多次了。 - Doug Smythies
谢谢你的回答。我已经尝试过类似第二种解决方案的方法,但后来发现time的格式选项非常适合我的需求。使用你的方法来获取毫秒,例如,有没有与time -f "%e" -o /path/to/file -a command等效的语法? - user877529
事实上,我要补充的是,与您链接中问题的作者相比,我的需求正好相反。更改TIMEFORMAT环境变量对我来说并不是最重要的问题,因为我只是在一个临时的虚拟机上完成任务。我只是不知道该如何做。我尝试了set命令,但在列表中没有找到这样的变量... - user877529