2009-05-30 2 views
21

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

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

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

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

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

+0

какая версия gcc вы используете? do gcc --version в командной строке, чтобы узнать – 2009-05-30 11:13:18

+0

Версия gcc v3.4.5 – Calmarius

ответ

13

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

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

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

+5

+1 Я тоже это испытываю, отключая мои сетевые адаптеры, при непосредственном запуске. Включение фиктивных записей DNS (127.0.0.1) для контроллеров домена в файл моих хостов делает вещи _much_ быстрее, но не так быстро, как полностью отключить сеть. –

+0

Наш контроллер AD находится по адресу: server.domain.com. Добавление «127.0.0.1 server.domain.com» в файл моих хостов делает трюк. – rcmadruga

+0

Спасибо за этот намек. Я давно задавался вопросом, почему это происходит только на одной из моих машин! Так получилось, что он не связан с его доменом AD ... –

0

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

Мой MinGW распределение ("дистрибутивы") является 64-нативной и в настоящее время содержит GCC 6.1.0 и увеличить 1.61.0.

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

6

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

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

This answer объясняет более подробно, как Cygwin и MinGW используется для имитацииfork() и this answer имеет более до даты объяснения.

+1

Вы пытаетесь сказать нам, что fork() действительно используется для клонирования текущего процесса вместо того, чтобы следовать execp()? Какому компилятору/компоновщику нужно клонировать процесс? – 2015-08-13 16:16:24

+1

@ExcessPhase Я не уверен, что вы подразумеваете под этим. Программы Unix используют 'fork()' для создания дочерних процессов. Когда вы компилируете эту программу Unix для MinGW, 'fork()' call * still * необходимо создать дочерний процесс, как это было бы в «реальном» Unix, даже если fork() 'сопровождается * exec *, no вопрос о том, насколько медленна эскизная вилка MinGW, потому что компилятор не может изменить код программы, чтобы работать более эффективно под Windows. – hyde

+0

@ExcessPhase Хотя, возможно, все было оптимизировано, я добавил ссылку на второй ответ только сейчас. – hyde

1

По 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() для извлечения учетной записи пользователя с локального компьютера. Он не работает для пользователей домена, поэтому он вызывает его второй раз с сервером постоянного тока, взятым из переменной LOGONSERVER. Если этот хост не сразу доступен, он введет долгую задержку до тех пор, пока вызов не завершится с ошибкой. Приложение начнется вскоре после этого.

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

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