我在Windows上使用Code :: Blocks IDE和GCC/MinGW,我正在尝试构建一个wxWidgets应用程序,其中包含ca. 20k线和40个源模块.它构建非常慢.
编译C++模块持续2-5秒,链接持续2-3分钟.
它是一个可移植的代码,这段代码在Linux上编译速度非常快.我无法按照构建消息窗口...整个过程持续不到20秒.
我尝试了常见的调整(例如,预编译头,关闭优化等),但没有任何效果.
为什么这么慢?
您是否在Active Directory域中,但没有立即连接到它?
虽然我没有关于为什么MinGW会变慢的"答案",但我的经验是属于AD域但无法到达AD控制器的计算机在启动可执行文件时有延迟(例如rxvt.exe)和当前正在运行的那些经历暂停或口吃(例如emacs,它是使用MinGW构建的).
我仍在调查以确定这种行为的实际原因,但我想如果它适用于你,我会提到它.
MinGW上的许多"unixy"东西都很慢,因为Windows没有fork()
.Windows只有CreateProcess()
,这是完全不同的.Unix shell和GNU Make做了很多分叉,所以在MinGW下运行这些会产生"模拟"的分支,这非常慢.
另一个受此影响的是GNU Autotools,因此./configure
在从源代码构建"unixy"应用程序时运行脚本也非常慢.如果您需要多次执行此操作(例如,遇到配置以查找所有库时遇到麻烦),这会非常烦人.
这个答案详细介绍了Cygwin和MinGW的如何使用模拟fork()
,并且这个答案有更多的最新解释.
由于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的启动被延迟命中.从shell启动的实用程序不会产生影响.
延迟可能会有所不同,在我的情况下是21秒.
延迟命令启动后10-20秒内运行任何MSYS实用程序,没有新的延迟.
当计算机连接到其他网络,或与其域断开连接时,或者域控制器主机名更改时(在我的情况下出现问题),会出现问题.要检查DC是否可访问,请打开cmd
并键入echo %LOGONSERVER%
,然后ping
或net view
使用DC的主机名.
为什么这么慢:
MSYS DLL
in 的代码uinfo.cc internal_getlogin()
进行两次系统调用以获取用户信息.它第一次调用NetUserGetInfo()
从本地计算机中检索用户帐户.它对域用户来说是失败的,所以它第二次调用DC服务器来自LOGONSERVER
变量.如果无法立即访问此主机,则会导致长时间延迟,直到超时时呼叫失败.申请将在不久后开始.
如何避免这个问题,几个解决方法:
从MSYS shell运行所有内容,或者
如果原因是DC主机名的更改,则重新启动或重新登录将解决该问题.Windows将LOGONSERVER
使用正确的DC主机自动更新.
如果从Windows cmd
或脚本调用MSYS工具,则设置 LOGONSERVER
为localhost以避免网络访问.比如set LOGONSERVER=\\LOCALHOST
为我工作.注意:此变量在登录时设置,并且在Windows环境变量窗口中全局更改此变量与在其中设置cmd
或脚本相比无效.
我认为这是MinGW/MSYS中的一个错误.MSYS2和Cygwin中的代码是不同的.我检查了MSYS2,它没有这样的问题.