如何在管道中使用GNU时间命令

20

我想测量在PostgreSQL中一些SQL查询的运行时间。使用BASH内置的time,我可以执行以下操作:

$ time (echo "SELECT * FROM sometable" | psql)

我喜欢GNU Time,它提供了更多的格式选项。但是我不知道如何在管道中使用它。为了简单起见,在下面的示例中,我使用ls | wc

$ /usr/bin/time -f "%es" (ls | wc)                                                      
-bash: syntax error near unexpected token `('

$ /usr/bin/time -f "%es" "ls | wc"                                                  
/usr/bin/time: cannot run ls | wc: No such file or directory

如果我没有以任何方式对管道进行分组,它就不会抱怨:
$ /usr/bin/time -f "%es" ls | wc       
0.00s

但显然,这只测量了管道的第一部分,如下例所示。
$ /usr/bin/time -f "%es" ls | sleep 20                                                  
0.00s 

那么问题是使用管道符正确的GNU时间命令的语法是什么?

2个回答

18

时间调用Shell:

/usr/bin/time -f "%es" bash -c "ls | wc"
当然,这也包括shell的启动时间;它不应该太久,但如果你使用的是像 dash 这样轻量级的shell(并且足以满足你的需求),那么你可以使用它来最小化启动时间开销:
当然,这也包括 shell 的启动时间;它不应该太长,但如果你所在的系统拥有像 dash 这样轻量级的shell(并且能够满足你的需要),那么你可以使用它来减少启动时间开销:
/usr/bin/time -f "%es" dash -c "ls | wc"

另一种选择是直接计时您感兴趣的命令,即psql命令。 time将其标准输入传递给正在执行的程序,因此您可以仅对管道的一个组件运行它:

echo "SELECT * FROM sometable" | /usr/bin/time -f "%es" psql

最后一个方案非常适合我的问题。其他的更加灵活。谢谢! - stderr

3
创建一个脚本来调用你的流水线。然后...
/usr/bin/time -f '%es' script.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接