18

postgresql で SQL クエリの実行時間を測定したいと考えています。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"

もちろん、これにはシェルの起動時間も含まれます。多すぎるべきではありませんが、次のような軽量シェルを使用しているシステムをdash使用している場合 (必要なことを行うには十分です)、それを使用して起動時間のオーバーヘッドを最小限に抑えることができます。

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

別のオプションは、実際に興味のあるコマンド、つまりコマンドの時間を計ることですpsqltime実行中のプログラムに標準入力を渡すため、パイプラインの 1 つのコンポーネントでのみ実行できます。

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 に答える