Могу ли я ускорить форк Cygwin?
Я наткнулся на статью, в которой обсуждается скорость разветвления в Cygwin, и в Windows XP ожидаемая скорость разветвления составляет около 30-50 в секунду ( ссылка).
У меня есть Core 2 Duo (1,79 ГГц), который я ожидаю получить сравнимые результаты, но он управляет только 8 разветвлениями в секунду (а иногда и намного меньше):
$ while (true); do date --utc; done | uniq -c
5 Wed Apr 21 12:38:10 UTC 2010
6 Wed Apr 21 12:38:11 UTC 2010
1 Wed Apr 21 12:38:12 UTC 2010
1 Wed Apr 21 12:38:13 UTC 2010
8 Wed Apr 21 12:38:14 UTC 2010
8 Wed Apr 21 12:38:15 UTC 2010
6 Wed Apr 21 12:38:16 UTC 2010
1 Wed Apr 21 12:38:18 UTC 2010
9 Wed Apr 21 12:38:19 UTC 2010
Можете ли вы предложить что-нибудь, что я мог бы сделать, чтобы ускорить процесс? Эта машина работает намного медленнее в Cygwin, чем другие, которые я использовал ранее, но которые были намного медленнее.
Обновить
Позвольте мне обосновать мой вопрос: я не верю, что более быстрый форк волшебным образом улучшит мою жизнь, но я считаю, что этот тест является хорошим прокси для проблем производительности, которые я вижу в bash из-за нормального использования внешних исполняемых файлов рассчитать значения. Я обнаружил, что заметно ускоряю работу Cygwin, просматривая сценарии запуска оболочки и bash-завершение, и пытаясь заменить внешние команды внутренними; в Linux это не проблема. Однако часто это невозможно, и в настоящее время моему ПК требуется ~14 секунд, чтобы запустить оболочку с теплым кешем и без нагрузки.
3 ответа
Это не имеет ничего общего с медленной развилкой.
Я видел, как cygwin медленно запускал собаку, когда каталог "home" на Windows находился на сетевом диске. Каждая команда будет искать там двоичные файлы, которые сильно замедляют работу.
видишь ли, если
while (true); do /bin/date --utc; done | uniq -c
быстрее, если так, то это, вероятно, ваша проблема
в противном случае попробуйте запустить bash через strace / ltrace (если они даже работают на cygwin) и посмотрите, что он делает, когда на выполнение даты уходит 1 секунда.
Боюсь, с этим ничего не поделаешь.
Винда не имеет родной fork()
Системный вызов, поэтому Cygwin должен подражать этому. Однако реализация этой эмуляции очень неэффективна. (См. Cygwin FAQ)
MSYS2, который часто используется в приложениях, где требуется, возможно, полнофункциональная Linux-подобная среда командной строки в Windows, основан на Cygwin, поэтому на него это тоже влияет.
Это на самом деле так плохо, что fork()
в Windows как минимум на порядок медленнее, чем в Linux
msys2bash-windows-box$ time { date; }
Sa, 24. Feb 2018 16:51:44
real 0m0,046s
user 0m0,000s
sys 0m0,000s
msys2bash-windows-box$ while (true); do /bin/date --utc; done | uniq -c
13 Sa, 24. Feb 2018 15:57:18
17 Sa, 24. Feb 2018 15:57:19
16 Sa, 24. Feb 2018 15:57:20
bash-linux-box$ time { date; }
Sat Feb 24 15:51:54 UTC 2018
real 0m0.002s
user 0m0.000s
sys 0m0.000s
bash-linux-box$ while (true); do date --utc; done | uniq -c
211 Sat Feb 24 15:56:35 UTC 2018
286 Sat Feb 24 15:56:36 UTC 2018
260 Sat Feb 24 15:56:37 UTC 2018
Приведенный выше пример показывает разницу между i5-2500k @ 4 ГГц, 32 ГБ ОЗУ Windows 10 Pro box и слабым одноядерным, 1 ГБ ОЗУ VPS
Вы не видите вилки; вы видите fork, exec, системный вызов для чтения времени суток, форматирования и преобразования выходных данных. Не говоря уже о параллельном распределении времени.
На каком основании вы говорите, что другие машины "на самом деле были медленнее"? Есть много вещей, которые влияют на фактическую скорость компьютера и восприятие пользователем скорости компьютера. Что вы делаете, когда скорость в секунду / сек является хорошим показателем производительности? Какова скорость памяти, архитектура и объем? Скорость дискового ввода-вывода и буферизация?
Как вы думаете, что будет делать больше форкс / сек: Core i7 под управлением Vista с 512 МБ ОЗУ или Celeron под минимальным Linux с 2 ГБ?