Проблема, с которой вы сталкиваетесь, заключается не в каком-то произвольном ограничении в Cygwin, которое вы можете устранить, изменив настройки.Это неотъемлемый аспект того, как Cygwin должен работать, чтобы получить ожидаемые программы семантики POSIX.
Системный вызов POSIX fork()
не имеет собственного эквивалента в Windows, поэтому Cygwin вынужден эмулировать его в очень неэффективный способ .Сценарии оболочки вызывают вызов fork()
каждый раз, когда они выполняют внешний процесс, что происходит довольно часто, поскольку языки сценариев оболочки настолько бедны по сравнению с тем, что мы обычно называем языком программирования.Внешние программы - это то, как сценарии оболочки делают что-либо значимое.
Есть и другие недостатки в Cygwin, хотя, если вы его профилируете, вы, вероятно, обнаружите, что это удар по скорости номер один.В большинстве мест уровень Cygwin между программой, созданной на его основе, и базовой ОС довольно тонкий.Разработчики Cygwin прилагают много усилий, чтобы сохранить слой как можно более тонким, в то же время обеспечивая правильную семантику POSIX.Нынешняя необычная толщина в эмуляции вызовов fork()
неизбежна, если не считать добавление Microsoft собственных средств типа fork()
в их ОС.Их стимулы сделать это не очень хороши.
Решения, опубликованные выше в виде комментариев, неплохие.
Другая возможность - пройти скрипт drush
и посмотреть, есть ливызовы внешних программ, которые вы можете заменить внутренними оболочками или более эффективными конструкциями.Я не ожидал бы значительного улучшения скорости при этом, но у него есть приятное свойство, которое позволит ускорить работу и на стороне Linux.(fork()
эффективен в Linux, но запуск внешних программ по-прежнему является большим ударом по скорости, и вам, возможно, не придется платить так часто, как в настоящее время). Например:
numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...
будет работать быстрее, так как:
if grep -q somepattern $somefile ; then ...
Первая версия, возможно, более ясна, но требует как минимум трех вызовов внешних программ и с примитивными оболочками four .(Вы видите их все?) Для замены требуется только один внешний вызов программы.