C++ 为什么MinGW很慢?

C++ 为什么MinGW很慢?,c++,performance,mingw,codeblocks,C++,Performance,Mingw,Codeblocks,我在Windows上使用带有GCC/MinGW的Code::Blocks IDE,并尝试构建一个wxWidgets应用程序,它有大约20k行和40个源模块。它的构建速度非常非常慢 编译一个C++模块,持续2-5秒,链接持续2-3分钟。 这是一个可移植的代码,在Linux上编译速度非常快。我无法跟踪生成消息窗口。。。整个过程持续不到20秒 我尝试了一些常见的调整(例如,预编译头、关闭优化等),但没有任何效果 为什么这么慢?您是否在Active Directory域上,但没有立即连接到该域 虽然我不

我在Windows上使用带有GCC/MinGW的Code::Blocks IDE,并尝试构建一个wxWidgets应用程序,它有大约20k行和40个源模块。它的构建速度非常非常慢

编译一个C++模块,持续2-5秒,链接持续2-3分钟。 这是一个可移植的代码,在Linux上编译速度非常快。我无法跟踪生成消息窗口。。。整个过程持续不到20秒

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


为什么这么慢?

您是否在Active Directory域上,但没有立即连接到该域

虽然我不知道为什么MinGW会很慢,但根据我的经验,属于AD域但无法到达AD控制器的计算机在启动可执行文件(如rxvt.exe)时会出现延迟,而当前运行的计算机会出现暂停或结巴(如使用MinGW构建的emacs)


我仍在调查,以确定这种行为的实际原因,但我想我会提到它,以防它适用于您。

您可以尝试使用更新版本的工具集。我发现这很有用: 它将MinGW使用的所有工具和公共api放在一个大的包中。 从网站:

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

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

MinGW上的许多“unixy”操作非常慢,因为Windows没有
fork()
。Windows只有
CreateProcess()
,这是完全不同的。unixshell和GNU做了大量的分叉,所以在MinGW下运行这些会导致“模拟”分叉,这非常慢

另一个问题是GNU自动工具,因此从源代码构建“unixy”应用程序时运行
/configure
脚本也非常慢。如果您需要多次执行此操作(例如,在获取配置以查找所有库时遇到问题),则此操作会变得非常烦人


更详细地说明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%
    ,然后使用DC的主机名
    ping
    net view
为什么这么慢:

  • uinfo.cc internal_getlogin()
    中的
    MSYS DLL
    代码进行两次系统调用以获取用户信息。第一次调用
    NetUserGetInfo()
    从本地计算机检索用户帐户时。它对域用户失败,因此它使用取自
    LOGONSERVER
    变量的DC服务器第二次调用它。如果无法立即访问此主机,则会引入很长的延迟,直到超时时调用失败。应用程序将在稍后启动
如何避免此问题,有几种解决方法:

  • 从MSYS shell运行所有内容,或者
  • 如果原因是DC主机名的更改,则重新启动或重新登录将解决此问题。Windows将使用正确的DC主机自动更新
    LOGONSERVER
  • 如果从Windows
    cmd
    或脚本调用MSYS工具,则将
    LOGONSERVER
    设置为本地主机以避免网络访问。例如,
    set LOGONSERVER=\\LOCALHOST
    对我有效。注意:此变量是在登录时设置的,在Windows环境变量窗口中全局更改它与在
    cmd
    或脚本中设置它相比没有效果
  • 我认为这是MIW/MSES中的一个bug。MSYS2和Cygwin中的代码不同。我检查了MSYS2,它没有这样的问题
您使用的是哪个gcc版本?在命令行中执行gcc--version以了解+1我也遇到了这种情况,禁用网络适配器会立即启动。将域控制器的伪造DNS条目(127.0.0.1)放在我的主机文件中会使事情变得更快,但不如完全禁用网络那么快。我们的AD控制器位于:server.domain.com。将“127.0.0.1 server.domain.com”添加到我的主机文件就可以了。谢谢你的提示。我一直在想为什么这只发生在我的一台机器上!碰巧它没有连接到它的广告域…我会被诅咒的。我已经为此咬紧牙关好几个月了——我刚关掉了笔记本电脑上的wifi,msys utils非常非常快。你是想告诉我们,fork()真的是用来克隆当前进程的,而不是被execp()跟踪吗?哪个编译器/链接器需要克隆进程?@ExcessPhase我不知道你的意思。Unix程序使用