14

Я наткнулся на пост, в котором обсуждается скорость разветвления в 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 ответа3

1

Это не имеет ничего общего с медленной развилкой.

Я видел, как cygwin медленно запускал собаку, когда папка windows "home" находилась на сетевом диске. Каждая команда будет искать там двоичные файлы, которые сильно замедляют работу.

видишь ли, если

while (true); do /bin/date --utc; done | uniq -c

быстрее, если так, то это, вероятно, ваша проблема

в противном случае попробуйте запустить bash через strace/ltrace (если они даже работают на cygwin) и посмотрите, что он делает, когда на выполнение даты уходит 1 секунда.

0

Боюсь, с этим ничего не поделаешь.

Windows не имеет системного вызова 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

0

Вы не видите вилки; вы видите fork, exec, системный вызов для чтения времени суток, форматирования и преобразования выходных данных. Не говоря уже о параллельном распределении времени.

На каком основании вы говорите, что другие машины "на самом деле были медленнее"? Есть много вещей, которые влияют на фактическую скорость компьютера и восприятие пользователем скорости компьютера. Что вы делаете, когда скорость в секунду / сек является хорошим показателем производительности? Какова скорость памяти, архитектура и объем? Скорость дискового ввода-вывода и буферизация?

Как вы думаете, что будет делать больше форкс / сек: Core i7 под управлением Vista с 512 МБ ОЗУ или Celeron под минимальным Linux с 2 ГБ?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .