Как использовать 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 с линией трубопровода?
Ответы
Ответ 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