2009-05-30 207 views
21

我在Windows上使用Code :: Blocks IDE和GCC/MinGW,我試圖構建一個wxWidgets應用程序,它有ca. 20k線和40個源模塊。它的構建非常緩慢。爲什麼MinGW很慢?

編譯一個C++模塊持續2-5秒,甚至連續持續2-3分鐘。

這是一個可移植的代碼,並且此代碼在Linux上編譯速度非常快。我無法關注構建消息窗口......整個過程持續不到20秒。

我嘗試了常見的調整(例如,預編譯頭文件,關閉優化等),但沒有任何工作。

爲什麼這麼慢?

+0

你正在使用哪個gcc版本?在命令行執行gcc --version來查找 – 2009-05-30 11:13:18

+0

gcc版本是v3.4.5 – Calmarius 2009-06-01 10:55:11

回答

13

您是否在Active Directory域中,但沒有立即連接到它?

儘管我沒有「爲什麼MinGW會很慢」的答案,但我的經驗是,屬於AD域但無法到達AD控制器的計算機在啓動時會有延遲可執行文件(如rxvt.exe)和當前正在運行的程序會遇到暫停或斷斷續續的問題(例如使用MinGW構建的emacs)。

我仍在調查以確定此行爲的實際原因,但認爲我會提及它以防它適用於您。

+5

+1我也遇到過這種情況,禁用我的網絡適配器會立即啓動。在主機文件中爲域控制器添加虛假的DNS條目(127.0.0.1)會使事情更快速,但並不像完全禁用網絡那麼快。 – 2011-08-17 18:18:50

0

您可以嘗試使用更新版本的工具集。我發現它很有用: http://nuwen.net/mingw.html 它具有MinGW和通用API在單個大型軟件包中使用的所有工具。 從網站:

我MinGW的分佈( 「發行」)是x64的本地和當前包含 GCC 6.1.0和Boost 1.61.0。

MinGW是GCC到Windows的一個端口。它是免費的,並簡單到 的使用(好吧,就像工具鏈一樣簡單)。它產生獨立的 Windows可執行文件,可以以任何方式分發。

6

MinGW上的許多「unixy」事情都非常緩慢,因爲Windows沒有fork()。 Windows只有CreateProcess(),這是完全不同的。 Unix shell和GNU Make做了很多分支,所以在MinGW下運行它們會產生「仿真」的分支,這些分支非常慢。

另一件受此影響的事情是GNU Autotools,所以從源代碼構建「unixy」應用程序時運行./configure腳本的速度也很慢。如果您需要多次執行此操作(例如,在遇到配置以查找所有庫時遇到麻煩),這可能會非常煩人。

This answer詳細介紹了Cygwin和MinGW的如何使用模擬fork(),並this answer有更多的最新解釋。

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 shell實用程序,只有殼的啓動被延遲的打擊。從shell啓動的實用程序不會產生影響。

  • 延遲可能會有所不同,在我的情況下是21秒。

  • 在延遲命令後的10-20秒內運行任何MSYS實用程序將無延遲地啓動。
  • 當機器連接到不同的網絡,或從域中斷開連接時,或域控制器主機名更改(本例中存在問題)時出現問題。要檢查DC是否可達,請打開cmd並輸入echo %LOGONSERVER%,然後輸入pingnet view與DC的主機名。

爲什麼這麼慢:

  • MSYS DLLuinfo.cc internal_getlogin()中的代碼,使兩個系統調用來獲取用戶信息。第一次它呼叫NetUserGetInfo()從本地機器檢索用戶帳戶。對於域用戶而言,它失敗了,所以它在第二次調用DC服務器時取自LOGONSERVER變量。如果這臺主機不能立即訪問,它會引入一個長時間的延遲,直到超時時調用失敗。該應用程序將在不久後開始。

如何避免這個問題,幾個解決方法:

  • 無論是運行一切從MSYS殼,或
  • 如果原因是在DC主機名的變化,然後重新啓動或重新登錄會解決問題。 Windows將使用正確的DC主機自動更新LOGONSERVER
  • 如果從Windows cmd或腳本調用MSYS工具,則將LOGONSERVER設置爲本地主機以避免網絡訪問。例如。 set LOGONSERVER=\\LOCALHOST爲我工作。注意:該變量在登錄時設置,並且在Windows環境變量窗口中全局更改該變量與將其設置爲cmd或腳本相比無效。
  • 我認爲這是MinGW/MSYS中的一個錯誤。 MSYS2和Cygwin中的代碼是不同的。我檢查了MSYS2,它沒有這樣的問題。