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)
| 归档时间: |
|
| 查看次数: |
5208 次 |
| 最近记录: |