当前位置:  开发笔记 > 编程语言 > 正文

为什么MinGW很慢?

如何解决《为什么MinGW很慢?》经验,为你挑选了3个好方法。

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

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

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

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

为什么这么慢?



1> mdaniel..:

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

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

我仍在调查以确定这种行为的实际原因,但我想如果它适用于你,我会提到它.


+1我也遇到这种情况,禁用我的网络适配器会立即启动.在我的hosts文件中为域控制器设置伪造的DNS条目(127.0.0.1)会使事情变得更快,但不会像完全禁用网络那样快.

2> hyde..:

MinGW上的许多"unixy"东西都很慢,因为Windows没有fork().Windows只有CreateProcess(),这是完全不同的.Unix shell和GNU Make做了很多分叉,所以在MinGW下运行这些会产生"模拟"的分支,这非常慢.

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

这个答案详细介绍了Cygwin和MinGW的如何使用模拟fork(),并且这个答案有更多的最新解释.



3> 小智..:

由于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 bashshell 启动实用程序时,只有shell的启动被延迟命中.从shell启动的实用程序不会产生影响.

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

延迟命令启动后10-20秒内运行任何MSYS实用程序,没有新的延迟.

当计算机连接到其他网络,或与其域断开连接时,或者域控制器主机名更改时(在我的情况下出现问题),会出现问题.要检查DC是否可访问,请打开cmd并键入echo %LOGONSERVER%,然后pingnet view使用DC的主机名.

为什么这么慢:

MSYS DLLin 的代码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,它没有这样的问题.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有