Запуск grep, открыв терминал Cygwin через Microsoft Remote Desktop на Windows Server 1012 R2 (как изначально?):
Administrator@MYSERV /cygdrive/d/bin/beta
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme
real 1m40.568s
user 1m40.405s
sys 0m0.140s
Точно такая же команда для тех же файлов, выполняемая при подключении через Cygwin SSH:
Administrator@MYSERV /cygdrive/d/bin/beta
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delmessh
real 0m0.148s
user 0m0.140s
sys 0m0.000s
Исполняемый файл grep.exe такой же, выходной файл такой же, но время выполнения составляет доли секунды против почти 2 минут.
Учитывая, что cygwin SSH работает под специальной настройкой пользователя, я попытался ssh localhost
на удаленном рабочем столе; время выполнения: 1 минута 40 секунд.
Есть ли этому какое-то логическое или нелогичное объяснение? Какие настройки, которые я могу проверить в Windows Server 2012, искусственно подавляют процессы удаленного рабочего стола?
Обновить: запуск C: \ cygwin \ bin \ grep.exe из командной строки Windows cmd
также мгновенно. Итак, есть проблема с терминалом Cygwin.
Обновление 2: Я googledd, что наличие мертвых файловых ресурсов в PATH может замедлить работу терминала Bash. Вопреки моей первоначальной надежде, стирание переменной $ PATH ничего не дало. У меня также нет мертвых ссылок в PATH.
Решение, слава @Paul Haldane: Grep похоже скинул $LANG
значение en_US.UTF-8
, который используется по умолчанию в Cygwin. Это особенно сильно сказывается на производительности регулярных выражений. Бег grep -F
также был медленнее, но всего в 4 раза.
Вот проверка на отдельном сервере:
$ echo $LANG
en_US.UTF-8
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme
real 1m56.425s
user 1m56.218s
sys 0m0.171s
$ LANG=''
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme2
real 0m0.286s
user 0m0.265s
sys 0m0.015s
$ diff delme delme2
** no difference **
Решение, слава @Paul Haldane:
Был ошибка в grep, которая приводила к медленному поиску, когда LANG был установлен не на C - Пол Холдейн 22 часа назад
Grep, похоже, сбрасывается значением $ LANG для en_US.UTF-8, которое в Cygwin используется по умолчанию. Это особенно сильно сказывается на производительности регулярных выражений. Команда grep -F также была медленнее, но только в 4 раза.
Вот проверка на отдельном сервере:
$ echo $LANG
en_US.UTF-8
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme
real 1m56.425s
user 1m56.218s
sys 0m0.171s
$ LANG=''
$ time grep -inowf matchfile_431184247462809.temp infile_431184247462809.temp > delme2
real 0m0.286s
user 0m0.265s
sys 0m0.015s
$ diff delme delme2
** no difference **
Например, ssh добавляет накладные расходы из-за шифрования, но это не объясняет переход от секунд к минутам, а объясняет тот факт, что Cygwin эмулирует терминал Unix, а эмуляция выполняется медленно. Вы можете найти более подробную информацию об этом в Википедии. https://en.wikipedia.org/wiki/Cygwin
Эта часть объясняет это довольно хорошо
Системный вызов fork для дублирования процесса полностью реализован, но не соответствует Windows API. Например, нельзя было использовать стратегию оптимизации копирования при записи. [5] [6] [7] В результате вилка Cygwin довольно медленная по сравнению с Linux и другими. (Эти накладные расходы часто можно избежать, заменив использование техники fork / exec вызовами функций порождения, объявленных в специфичном для Windows заголовке process.h).