2012-11-08 24 views
14

Tôi muốn đo thời gian chạy của một số truy vấn SQL trong postgresql. Sử dụng thời gian tích hợp BASH, tôi có thể làm như sau:cách sử dụng GNU Time với đường ống

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

Tôi thích thời gian GNU, cung cấp nhiều định dạng hơn. Tuy nhiên tôi không biết làm thế nào để làm điều đó với đường ống. Để đơn giản, tôi sử dụng ls | wc trong các ví dụ sau:

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

Nếu tôi không nhóm các đường ống trong bất kỳ cách nào, nó không than phiền:

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

Nhưng dường như, điều này chỉ đo phần đầu tiên của đường ống, như hiển thị trong ví dụ tiếp theo

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

Vì vậy, câu hỏi là cú pháp chính xác cho GNU Time với đường ống?

Trả lời

11

Gọi vỏ từ time:

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

Tất nhiên, điều này sẽ bao gồm các vỏ thời gian khởi động cũng; nó không nên quá nhiều, nhưng nếu bạn đang sử dụng hệ thống có vỏ nhẹ như dash (và nó đủ để làm những gì bạn cần), thì bạn có thể sử dụng để giảm thiểu thời gian khởi động:

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

Một tùy chọn khác sẽ chỉ là thời gian lệnh bạn thực sự quan tâm, đó là lệnh psql. time sẽ vượt qua đầu vào tiêu chuẩn của nó để chương trình được thực thi, vì vậy bạn có thể chạy nó trên chỉ là một phần của đường ống:

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

Giải pháp cuối cùng là hoàn hảo cho vấn đề của tôi. Những người khác linh hoạt hơn. Cảm ơn! – stderr

3

Tạo một kịch bản mà các cuộc gọi đường ống của bạn. Sau đó,

/usr/bin/time -f '%es' script.sh 
Các vấn đề liên quan