2012-11-08 8 views
14

Voglio misurare il tempo di esecuzione di alcune query SQL in postgresql. Usando il tempo integrato di BASH, potrei fare quanto segue:come utilizzare Tempo GNU con pipeline

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

Mi piace il tempo GNU, che fornisce più formati. Tuttavia non so come farlo con la linea di tubazioni. Per semplicità, io uso ls | wc nei seguenti esempi:

$ /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 

Se non lo faccio gruppo del tubo in alcun modo, non si lamenta:

$ /usr/bin/time -f "%es" ls | wc  
0.00s 

Ma a quanto pare, questa misura solo la prima parte del tubo, come mostrando nella prossima esempio

$ /usr/bin/time -f "%es" ls | sleep 20             
0.00s 

Quindi la domanda è che cosa è la sintassi corretta per GNU tempo con la linea del tubo?

risposta

11

chiamata la shell time:

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

Naturalmente, questo includerà il tempo di avvio della shell pure; non dovrebbe essere troppo, ma se sei su un sistema che ha una shell leggera come dash (ed è sufficiente per fare ciò che ti serve), puoi utilizzarlo per ridurre al minimo il tempo di avvio:

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

Un'altra opzione sarebbe quella di dedicare solo il comando al quale si è effettivamente interessati, ovvero il comando psql. time passerà il suo standard input al programma in esecuzione, in modo da poter funzionare su una sola componente del gasdotto:

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

L'ultima soluzione è perfetta per il mio problema. Gli altri sono più flessibili. Grazie! – stderr

3

creare uno script che richiama la pipeline. Poi

/usr/bin/time -f '%es' script.sh 
Problemi correlati