2010-03-25 3 views
19

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

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

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

+6

Прикрепите компакт-диск ubuntu? :) – Rimian

+2

Этот вопрос предполагает, что производительность drush для Windows эквивалентна linux drush и ограничена памятью или процессором. Это не само собой разумеющееся предположение: это может быть просто медленнее. – msw

+3

Дайте виртуализации попробовать ... с поддержкой аппаратного обеспечения, это может быть действительно удивительно –

ответ

25

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

Системный вызов POSIX fork() не имеет нативного эквивалента в Windows, поэтому Cygwin вынужден эмулировать его в a very inefficient way. Сценарии оболочки вызывают вызов 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 ... 

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

6

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

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

# cygstart.bat

старт "Cygwin"/высокая C: \ Cygwin \ Cygwin.bat

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

9

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

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

Урезание «PATH» может иметь огромное значение. :) – Rufflewind

Смежные вопросы