2009-05-30 210 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,它没有这样的问题。