Как ускорить Cygwin?
Я выполнял скриптовые скрипты (для Drupal) с Cygwin на моей относительно быстрой машине с Windows, но мне все еще нужно подождать около минуты для любой команды чистки (в частности, для очистки скрипта чистки).
Я вполне уверен, что это как-то связано со скоростью Cygwin, поскольку мои коллеги-разработчики (работающие под Linux) могут запускать эти сценарии примерно за 5 секунд.
Есть ли способ заставить Cygwin использовать больше памяти и / или процессора на терминал?
3 ответа
Проблема, с которой вы сталкиваетесь, заключается не в каком-то произвольном ограничении в 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 ...
Первая версия, возможно, более ясна, но требует как минимум трех внешних вызовов программы, а с примитивными оболочками - четыре. (Вы видите их все?) Для замены требуется только один внешний вызов программы.
Также посмотрите на вещи, которые замедляют запуск Cygwin:
- Обрежьте свой путь к Windows (до базовых значений, таких как%SystemRoot%\system32;%SystemRoot%)
- Удалите ненужные вещи из bashrc и bash_profile
- Переместите вещи, которые вам нужны только в окне терминала, из bashrc в bash_profile
- Одно удивительно большое время отстой в Cygwin - завершение Bash. Если вы используете его (и вы должны это делать, потому что это здорово), то завершение исходного кода только для тех команд, которые вам нужны (а не для всех, которые использовались по умолчанию). И, как уже упоминалось выше, источник их из
bash_profile
неbashrc
,
Вы можете дать Cygwin более высокий приоритет.
Напишите новый пакетный файл, например, "cygstart.bat" со следующим содержимым:
start "Cygwin" /high C:\cygwin\Cygwin.bat
/high
Переключатель дает оболочке более высокий приоритет процесса.