为什么MinGW很慢?

时间:2009-05-30 10:25:29

标签: c++ performance mingw codeblocks

我在Windows上使用Code :: Blocks IDE和GCC / MinGW,我正在尝试构建一个wxWidgets应用程序,其中包含ca. 20k线和40个源模块。它构建得非常慢。

编译C ++模块持续2-5秒,链接持续2-3分钟。

这是一个可移植的代码,这段代码在Linux上编译速度非常快。我无法关注构建消息窗口......整个过程持续时间不到20秒。

我尝试了常见的调整(例如,预编译的标头,关闭优化等等),但没有任何效果。

为什么这么慢?

4 个答案:

答案 0 :(得分:16)

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

虽然我没有关于为什么MinGW会变慢的“答案”,但我的经验是,属于AD域但无法访问AD控制器的计算机在启动可执行文件时有延迟(例如rxvt.exe)并且当前正在运行的那些经历暂停或口吃(例如使用MinGW构建的emacs)。

我仍在调查以确定此行为的实际原因,但我想如果它适用于您,我会提及它。

答案 1 :(得分:9)

MinGW上的许多“unixy”事情非常缓慢,因为Windows没有fork()。 Windows只有CreateProcess(),这是完全不同的。 Unix shell和GNU Make做了很多分叉,所以在MinGW下运行这些会导致“模拟”的分支,这非常慢。

另一个受此影响的是GNU Autotools,因此在从源代码构建“unixy”应用程序时运行./configure脚本也非常慢。如果您需要多次执行此操作(例如,在使用 configure 查找所有库时遇到麻烦),这会非常烦人。

This answer更详细地解释了Cygwin和MinGW 如何模拟fork()this answer有更多最新解释。

答案 2 :(得分:7)

MSYS 1.0.19-1开始,如果用户帐户位于Active Directory域且域控制器(DC)无法访问,则MSYS DLL将在启动任何MSYS可执行文件之前引入较长的延迟(使用{ {1}})。这会影响MSYS MSYS DLL和CoreUtils包中的所有命令行实用程序,例如makels等通常安装在rm中的。{/ p>

观察:

  • 从MSYS C:\MinGW\msys\1.0\bin shell启动实用程序时,只有shell的启动会受到延迟的影响。从shell启动的实用程序没有影响。

  • 延迟可能会有所不同,在我的情况下是21秒。

  • 在延迟命令启动后10-20秒内运行任何MSYS实用程序,没有新的延迟。
  • 当计算机连接到其他网络,或者与其域断开连接时,或者域控制器主机名发生更改时(我的情况下出现问题),会出现问题。要检查DC是否可以访问,请打开bash并键入cmd,然后键入echo %LOGONSERVER%ping,其主机名为DC。

为什么这么慢:

  • net viewMSYS DLL的代码进行两次系统调用以获取用户信息。第一次调用uinfo.cc internal_getlogin()从本地计算机中检索用户帐户。它对域用户来说是失败的,所以它第二次调用来自NetUserGetInfo()变量的DC服务器。如果无法立即访问此主机,则会导致长时间延迟,直到超时时呼叫失败。申请将在不久之后开始。

如何避免此问题,有几种解决方法:

  • 从MSYS shell或
  • 运行所有内容
  • 如果原因是DC主机名更改,则重新启动或重新登录将解决此问题。 Windows将使用正确的DC主机自动更新LOGONSERVER
  • 如果从Windows LOGONSERVER或脚本调用MSYS工具,则将cmd设置为localhost以避免网络访问。例如。 LOGONSERVER为我工作。注意:此变量在登录时设置,并且在Windows环境变量窗口中全局更改它与在set LOGONSERVER=\\LOCALHOST或脚本中设置它相比没有任何效果。
  • 我认为这是MinGW / MSYS中的一个错误。 MSYS2和Cygwin中的代码是不同的。我检查了MSYS2,它没有这样的问题。

答案 3 :(得分:-1)

您可以尝试使用更新版本的工具集。我发现这很有用: http://nuwen.net/mingw.html 它将MinGW使用的所有工具和常用API放在一个大包中。 来自网站:

  

我的MinGW发行版(“发行版”)是x64-native,目前包含   GCC 6.1.0和Boost 1.61.0。

     

MinGW是Windows的GCC端口。它是免费的,简单易用   使用(好吧,就像工具链一样简单)。它独立生产   Windows可执行文件,可以任何方式分发。