18

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

$ 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 Time 的正确语法是什么?

4

2 回答 2

15

从以下位置调用外壳time

/usr/bin/time -f "%es" bash -c "ls | wc"

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

/usr/bin/time -f "%es" dash -c "ls | wc"

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

echo "SELECT * FROM sometable" | /usr/bin/time -f "%es" psql
于 2012-11-08T17:40:11.357 回答
3

创建一个调用您的管道的脚本。然后

/usr/bin/time -f '%es' script.sh
于 2012-11-08T17:42:34.193 回答