我在Windows上使用Code :: Blocks IDE和GCC / MinGW,我正在尝试构建一个wxWidgets应用程序,其中包含ca. 20k线和40个源模块。它构建得非常慢。
编译C ++模块持续2-5秒,链接持续2-3分钟。
这是一个可移植的代码,这段代码在Linux上编译速度非常快。我无法关注构建消息窗口......整个过程持续时间不到20秒。
我尝试了常见的调整(例如,预编译的标头,关闭优化等等),但没有任何效果。
为什么这么慢?
答案 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包中的所有命令行实用程序,例如make
,ls
等通常安装在rm
中的。{/ p>
观察:
从MSYS C:\MinGW\msys\1.0\bin
shell启动实用程序时,只有shell的启动会受到延迟的影响。从shell启动的实用程序没有影响。
延迟可能会有所不同,在我的情况下是21秒。
bash
并键入cmd
,然后键入echo %LOGONSERVER%
或ping
,其主机名为DC。为什么这么慢:
net view
中MSYS DLL
的代码进行两次系统调用以获取用户信息。第一次调用uinfo.cc internal_getlogin()
从本地计算机中检索用户帐户。它对域用户来说是失败的,所以它第二次调用来自NetUserGetInfo()
变量的DC服务器。如果无法立即访问此主机,则会导致长时间延迟,直到超时时呼叫失败。申请将在不久之后开始。如何避免此问题,有几种解决方法:
LOGONSERVER
。LOGONSERVER
或脚本调用MSYS工具,则将cmd
设置为localhost以避免网络访问。例如。 LOGONSERVER
为我工作。注意:此变量在登录时设置,并且在Windows环境变量窗口中全局更改它与在set LOGONSERVER=\\LOCALHOST
或脚本中设置它相比没有任何效果。答案 3 :(得分:-1)
您可以尝试使用更新版本的工具集。我发现这很有用: http://nuwen.net/mingw.html 它将MinGW使用的所有工具和常用API放在一个大包中。 来自网站:
我的MinGW发行版(“发行版”)是x64-native,目前包含 GCC 6.1.0和Boost 1.61.0。
MinGW是Windows的GCC端口。它是免费的,简单易用 使用(好吧,就像工具链一样简单)。它独立生产 Windows可执行文件,可以任何方式分发。