Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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, которые могут быть распространены любым способом.