如何在管道中使用GNU Time

std*_*err 15 bash time pipeline gnu

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

$ time (echo "SELECT * FROM sometable" | psql)
Run Code Online (Sandbox Code Playgroud)

我喜欢GNU时间,它提供更多格式.但是我不知道怎么用管道做.为简单起见,我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
Run Code Online (Sandbox Code Playgroud)

如果我不以任何方式对管道进行分组,它不会抱怨:

$ /usr/bin/time -f "%es" ls | wc       
0.00s
Run Code Online (Sandbox Code Playgroud)

但显然,这仅测量管道的第一部分,如下一个示例所示

$ /usr/bin/time -f "%es" ls | sleep 20                                                  
0.00s 
Run Code Online (Sandbox Code Playgroud)

那么问题是GNU Time与管道的正确语法是什么?

Bri*_*ell 13

time以下地方调用shell :

/usr/bin/time -f "%es" bash -c "ls | wc"
Run Code Online (Sandbox Code Playgroud)

当然,这也将包括shell的启动时间; 它应该不会太多,但是如果你的系统具有轻量级的shell dash(并且它足以满足您的需求),那么您可以使用它来最小化启动时间开销:

/usr/bin/time -f "%es" dash -c "ls | wc"
Run Code Online (Sandbox Code Playgroud)

另一种选择是将你真正感兴趣的命令计时,即psql命令.time将其标准输入传递给正在执行的程序,因此您只需在管道的一个组件上运行它:

echo "SELECT * FROM sometable" | /usr/bin/time -f "%es" psql
Run Code Online (Sandbox Code Playgroud)