Как ускорить Cygwin?

Я запускал drush скрипты (для Drupal) с Cygwin на моей относительно быстрой машине окон, но я все еще должен ожидать приблизительно минута любой команды drush (конкретно drush кэш, ясный выполниться).

Я совершенно уверен, что это имеет некоторое отношение к скорости Cygwin, так как мои поддерживающие разработчики (кто запускает Linux) могут запустить эти скрипты приблизительно через 5 секунд.

Существует ли способ заставить Cygwin использовать больше памяти и/или ЦП на терминал?

19
задан Peter Mortensen 18 November 2018 в 02:10
поделиться

1 ответ

Проблема, с которой вы столкнулись это не какое-то произвольное ограничение в 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 ...

Первая версия, возможно, более ясна, но она требует как минимум трех вызовов внешней программы, а с примитивными оболочками четырех . (Вы их все видите?) Для замены требуется только один вызов внешней программы.

30
ответ дан 30 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: