Почему MinGW очень медленный? - PullRequest
27 голосов
/ 30 мая 2009

Я использую Code :: Blocks IDE с GCC / MinGW в Windows, и я пытаюсь создать приложение wxWidgets с ок. 20 тыс. Строк и 40 исходных модулей. И он очень медленно строится.

Компиляция модуля C ++ длится 2-5 секунд, а связывание - даже 2-3 минуты.

Это переносимый код, и этот код очень быстро компилируется в Linux. Я не могу проследить за окном сообщения сборки ... Весь процесс длится менее 20 секунд.

Я попробовал общие настройки (например, предварительно скомпилированный заголовок, отключить оптимизацию и т. Д.), Но ничего не помогло.

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

Ответы [ 4 ]

16 голосов
/ 08 декабря 2009

Вы находитесь в домене Active Directory, но не подключены к нему сразу?

Хотя у меня нет «ответа» о том, почему MinGW будет медленным, я знаю, что компьютеры, принадлежащие домену AD, но не имеющие доступа к контроллеру AD, имеют задержку запуска исполняемых файлов (например, rxvt.exe), а запущенные в настоящий момент испытывают паузу или заикание (например, emacs, созданный с использованием MinGW).

Я все еще расследую, чтобы определить действительную причину этого поведения, но подумал, что упомяну это в случае, если оно относится к вам.

10 голосов
/ 21 апреля 2015

Многие «неуклюжие» вещи в MinGW мучительно медленны, потому что в Windows нет fork(). Windows имеет только CreateProcess(), что совсем другое. Оболочки Unix и GNU Make делают много разветвлений, поэтому их запуск под MinGW приводит к «эмулируемым» разветвлениям, которые очень медленные.

Другая вещь, которая страдает от этого, - это GNU Autotools, поэтому запуск сценариев ./configure при сборке "unixy" приложений из исходников также очень медленный. Это может очень раздражать, если вам нужно делать это много раз (например, когда возникают проблемы с получением configure для поиска всех библиотек).

Этот ответ более подробно объясняет, как Cygwin и MinGW использовали для имитацию fork(), а этот ответ содержит более современное объяснение.

7 голосов
/ 07 мая 2017

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

Замечания:

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

  • Задержка может варьироваться, в моем случае это 21 с.

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

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

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

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

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

Вы можете попробовать использовать более новую версию набора инструментов. Я нашел это полезным: http://nuwen.net/mingw.html В нем есть все инструменты, используемые MinGW, и общие API в одном большом пакете. С сайта:

Мой дистрибутив MinGW ("distro") является родным для x64 и в настоящее время содержит GCC 6.1.0 и Boost 1.61.0.

MinGW - это порт GCC для Windows. Это бесплатно и просто использовать (ну, так просто, как когда-либо получаются наборы инструментов). Это производит автономный Исполняемые файлы Windows, которые могут распространяться любым способом.

...