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

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

19 голосов
/ 25 марта 2010

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

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

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

Ответы [ 3 ]

30 голосов
/ 26 марта 2010

Проблема, с которой вы сталкиваетесь, заключается не в каком-то произвольном ограничении в 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 .(Вы видите их все?) Для замены требуется только один внешний вызов программы.

11 голосов
/ 22 апреля 2012

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

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

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

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

start "Cygwin" /high C:\cygwin\Cygwin.bat

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

...