Руководство Debian's Bash предлагает использовать специальную подстановку команд $(< file)
, если для обеспечения производительности требуется $(cat file)
, избегая выполнения внешнего двоичного файла.
Однако, измеренное время завершения следующего кода примерно такая же:
time for i in {0..1000}; do echo str | { in=$(cat); }; done
time for i in {0..1000}; do echo str | { in=$(< /dev/fd/0); }; done
За несколько прогонов, они последовательно возвращают значения вокруг этих цифр, соответственно:
real 0m3.665s
user 0m0.365s
sys 0m0.782s
и
real 0m2.401s
user 0m0.233s
sys 0m0.533s
Таким образом, улучшение замены команд над cat
в значительной степени незначительна для большинства случаев использования. Поскольку мой скрипт должен быстро и циклично читать большое количество stdin, что я могу сделать, чтобы ускорить эти чтения? В частности, весь поток данных stdin необходимо сбрасывать в переменную Bash для дальнейших подстановок .
Дальнейшие испытания:
После комментариев ниже и дальнейшего тестирования, я поставил 10000 итераций вместо 1000 , чтобы свести к минимуму установка трубы над головой, и я удалил скобки для команды синтаксиса соединения:
$ time for i in {1..10000}; do echo str | in=$(cat); done
real 0m24.754s
user 0m6.958s
sys 0m18.996s
$ time for i in {1..10000}; do echo str | in=$(< /dev/fd/0); done
real 0m33.913s
user 0m3.736s
sys 0m10.516s
Здесь я не могу объяснить, почему $(< /dev/fd/0)
еще медленнее в настоящее время.
Я смущен. Ваш тест показывает ускорение на 33%. –
... и этот быстрый тест в значительной степени измеряет время, необходимое для настройки трубопровода, в отличие от производительности чтения stdin. Возможно, если вы указали нам свой * фактический * код, мы могли бы попытаться помочь с его оптимизацией, но, как бы то ни было, цифры, которые вы видите, выглядят в высшей степени разумными. –
Для интегрированного вызова Bash я ожидал чего-то в значительной степени ниже миллисекунды. – davide