Почему MinGW очень медленный?
Я использую IDE Code:: Blocks с GCC/MinGW в Windows, и я пытаюсь создать приложение wxWidgets, которое имеет ок. 20k линий и 40 исходных модулей. И он работает очень медленно.
Компиляция модуля С++ длится 2-5 секунд, а связь длится даже 2-3 минуты.
Это переносимый код, и этот код очень быстро компилируется в Linux. Я не могу следить за окном построения сообщения... Весь процесс длится менее 20 секунд.
Я попробовал общие твики (например, предварительно скомпилированный заголовок, отключить оптимизацию и т.д.), но ничего не получилось.
Почему это так медленно?
Ответы
Ответ 1
Вы находитесь в домене Active Directory, но не сразу подключены к нему?
В то время как у меня нет "ответа" о том, почему MinGW будет медленным, моим опытом было то, что компьютеры, принадлежащие домену AD, но неспособные достичь контроллера AD, задерживают запуск исполняемых файлов (например, rxvt.exe), а в настоящее время выполняются паузы или заикание (например, emacs, который создается с помощью MinGW).
Я по-прежнему расследую, чтобы определить фактическую причину этого поведения, но подумал, что я упомянул бы об этом в случае, если это применимо к вам.
Ответ 2
Многие "unixy" вещи на MinGW болезненно медленны, потому что Windows не имеет fork()
. У Windows только CreateProcess()
, что совсем другое. Unix shells и GNU. Сделайте много разветвления, поэтому их запуск под MinGW приводит к "эмулированным" вилкам, которые очень медленны.
Другая вещь, которая страдает от этого, - это GNU Autotools, поэтому запуск сценариев ./configure
при создании приложений "unixy" из источников также очень медленный. Это может стать очень раздражающим, если вам нужно делать это много раз (например, когда у вас возникают проблемы с настройкой, чтобы найти все библиотеки).
Этот ответ более подробно объясняет, как Cygwin и MinGW используются для моделирования fork()
и этот ответ содержит более подробные объяснения.
Ответ 3
Как и в случае 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, либо
- Если причиной является изменение имени хоста постоянного тока, то проблема при повторном входе в систему или повторный вход в систему будут устранены. Windows автоматически обновит
LOGONSERVER
с помощью правильного хоста постоянного тока.
- Если средства MSYS вызывают из Windows
cmd
или script, то установите LOGONSERVER
на локальный хост, чтобы избежать доступа к сети. Например. set LOGONSERVER=\\LOCALHOST
работал у меня. Примечание: эта переменная устанавливается при входе в систему и ее изменение глобально в окне Windows Environment Variables не имеет никакого эффекта по сравнению с настройкой в cmd
или script.
- Я считаю это ошибкой в MinGW/MSYS. Код в MSYS2 и Cygwin отличается. Я проверил MSYS2 и не имеет такой проблемы.
Ответ 4
Вы можете попробовать использовать более новую версию набора инструментов. Я нашел это полезным:
http://nuwen.net/mingw.html
Он имеет все инструменты, используемые MinGW и общие API в одном большом пакете.
На сайте:
Мой дистрибутив MinGW ( "дистрибутив" ) является x64-родным и в настоящее время содержит GCC 6.1.0 и Boost 1.61.0.
MinGW - это порт GCC для Windows. Это бесплатно и просто использовать (ну, так же просто, как toolchains когда-либо получить). Он производит автономный Исполняемые файлы Windows, которые могут быть распространены любым способом.