Подтвердить что ты не робот

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

Я запускал drush scripts (для drupal) с cygwin на моей относительно быстрой машине Windows, но мне все равно нужно подождать минутку для любой команды drush (в частности очистить кэширование кэша).

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

Есть ли способ заставить cygwin использовать больше памяти и/или процессора на терминал?

4b9b3361

Ответ 1

Проблема, с которой вы сталкиваетесь, - это не какой-то произвольный лимит в Cygwin, который вы можете уйти с изменением настроек. Это неотъемлемый аспект того, как Cygwin должен работать, чтобы получить построенные под ним программы семантики POSIX.

Системный вызов POSIX fork() не имеет собственного эквивалента в Windows, поэтому Cygwin вынужден эмулировать его в очень неэффективный способ. Сценарии оболочки вызывают вызов fork() каждый раз, когда они выполняют внешний процесс, что происходит довольно много, поскольку языки оболочки script настолько бедны относительно того, что мы обычно называем языком программирования. Внешние программы - это то, как скрипты оболочки получают все, что было сделано.

В Cygwin есть другие недостатки, хотя, если вы их профилировали, вы, вероятно, обнаружите, что скорость номер один. В большинстве мест слой Cygwin между программой, созданной с использованием ее и базовой ОС, довольно тонкий. Разработчики Cygwin прилагают много усилий, чтобы сохранить слой как можно более тонким, сохраняя при этом правильную семантику POSIX. Нынешняя необычная толщина в эмуляции вызова fork() неизбежна, если Microsoft не добавит встроенную среду типа fork() для своей ОС. Их стимулы для этого не очень хорошие.

Решения, опубликованные выше в качестве комментариев, неплохие.

Другая возможность - пройти через drush script и посмотреть, есть ли вызовы внешних программ, которые вы можете заменить оболочкой или более эффективными конструкциями. Я бы не ожидал огромного улучшения скорости, сделав это, но у него есть приятное свойство, которое вы также ускорите на стороне Linux. (fork() эффективен для Linux, но запуск внешних программ по-прежнему является большим быстродействием, что вам, возможно, не придется платить так часто, как вы сейчас делаете.) Например:

numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...

будет работать быстрее:

if grep -q somepattern $somefile ; then ...

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

Ответ 2

Также посмотрите на вещи, которые замедляют запуск cygwin:

  • Обрежьте свой Windows PATH (на голые кости, например% SystemRoot%\system32;% SystemRoot%)
  • Удалите ненужные вещи из bashrc и bash_profile
  • Переместите вещи, которые вам нужны только в окне терминала, от bashrc до bash_profile
  • Один из удивительно больших времен всасывания в cygwin - это завершение bash. Если вы используете его (и вы должны, потому что его отлично), используйте только исходное завершение для требуемых команд (а не все из них, которые раньше были по умолчанию). И, как упоминалось выше, отправьте их из bash_profile, а не bashrc.

Ответ 3

вы можете дать cygwin более высокий приоритет.

Напишите новый пакетный файл, например, "cygstart.bat" со следующим содержимым:

# cygstart.bat

запустите "Cygwin" /high C:\cygwin\Cygwin.bat

Переключатель "/high" дает оболочке более высокий приоритет процесса.