Как использовать GNU Time with pipe - программирование
Подтвердить что ты не робот

Как использовать GNU Time with pipe

Я хочу измерить время выполнения некоторого SQL-запроса в postgresql. Используя BASH встроенное время, я мог бы сделать следующее:

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

Мне нравится время 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

Если я никоим образом не группирую трубку, он не жалуется:

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

Но, по-видимому, это только измеряет первую часть трубы, как показано в следующем примере

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

Итак, вопрос в том, что является правильным синтаксисом для GNU Time с линией трубопровода?

4b9b3361

Ответ 1

Вызвать оболочку из time:

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

Конечно, это будет включать время запуска оболочки; это не должно быть слишком много, но если вы находитесь в системе с легкой оболочкой вроде dash (и это достаточно для того, чтобы делать то, что вам нужно), вы можете использовать ее для минимизации затрат времени на запуск:

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

Другим вариантом будет просто время, в которое вы действительно заинтересованы, это команда psql. time передаст свой стандартный ввод в исполняемую программу, поэтому вы можете запустить его только по одному компоненту конвейера:

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

Ответ 2

Создайте script, который вызывает ваш конвейер. Тогда

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