Почему MinGW очень медленный?

Начиная с MSYS 1.0.19-1, если учетная tuning запись пользователя находится fast в домене Active Directory, а cpp контроллер домена (DC) недоступен, то mingw MSYS DLL приведет к длительной задержке speed перед запуском любого исполняемого performance файла MSYS (который использует faster MSYS DLL). Это влияет на MSYS make и faster все утилиты командной строки perfomance из пакета CoreUtils, такие code-efficiency как ls, rm и т. Д., Которые обычно efficiency устанавливаются в C:\MinGW\msys\1.0\bin.

Наблюдения:

  • При performance запуске утилит из оболочки c++ MSYS bash задержка затрагивает perfomance только запуск оболочки. Утилиты, запускаемые cxx из оболочки, не влияют.

  • Задержка mingw может быть разной, в моем mingw случае она составляет 21 perfomance секунду.

  • Запуск любой утилиты MSYS в течение 10-20 секунд после отложенной команды запустится без новой задержки.
  • Проблема возникает, когда компьютер подключен к другой сети, или когда он отключен от своего домена, или когда изменяется имя хоста контроллера домена (проблема в моем случае). Чтобы проверить, доступен ли DC, откройте cmd и введите echo %LOGONSERVER%, затем ping или net view с именем хоста DC.

Почему так медленно:

  • Код MSYS DLL в uinfo.cc internal_getlogin() выполняет два системных вызова для получения информации о пользователе. В первый раз он вызывает NetUserGetInfo(), чтобы получить учетную запись пользователя с локального компьютера. Он не работает для пользователей домена, поэтому он вызывает его второй раз с сервером DC, взятым из переменной LOGONSERVER. Если этот хост недоступен немедленно, это приведет к длительной задержке до тех пор, пока вызов не завершится по таймауту. Приложение запустится вскоре после этого.

Как cxx избежать этой проблемы, несколько code-efficiency обходных путей:

  • Либо запустите все из оболочки MSYS, либо
  • Если причиной является изменение имени хоста контроллера домена, перезагрузка или повторный вход решат проблему. Windows автоматически обновит LOGONSERVER, указав правильный хост DC.
  • Если инструменты MSYS вызываются из Windows cmd или скрипта, установите для LOGONSERVER локальный хост, чтобы избежать доступа к сети. Например. set LOGONSERVER=\\LOCALHOST работал у меня. Примечание: эта переменная устанавливается при входе в систему, и ее глобальное изменение в окне переменных среды Windows не имеет никакого эффекта по сравнению с ее установкой в ​​cmd или скрипте.
  • Я считаю это ошибкой в ​​MinGW / MSYS. Код в MSYS2 и Cygwin отличается. Я проверил MSYS2, и в нем нет такой проблемы.

c++

performance

mingw

codeblocks

2022-10-14T01:46:45+00:00