为什么MinGW很慢?

问题描述 投票:0回答:4

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

编译一个C++模块需要2-5秒,链接甚至需要2-3分钟。

这是一个可移植的代码,并且该代码在 Linux 上编译得非常快。我无法跟随构建消息窗口...整个过程持续不到 20 秒。

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

为什么这么慢?

c++ performance mingw codeblocks msys2
4个回答
20
投票

您是否位于 Active Directory 域中,但未立即连接到该域?

虽然我没有关于为什么 MinGW 会很慢的“答案”,但根据我的经验,属于 AD 域但无法到达 AD 控制器的计算机在启动可执行文件时会出现延迟(例如如 rxvt.exe)并且当前正在运行的程序会遇到暂停或卡顿(例如使用 MinGW 构建的 emacs)。

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


19
投票

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
    中的
    uinfo.cc internal_getlogin()
    代码进行了两次系统调用来获取用户信息。第一次它调用
    NetUserGetInfo()
    从本地计算机检索用户帐户。它对于域用户失败,因此它使用从
    LOGONSERVER
    变量获取的 DC 服务器第二次调用它。如果不能立即访问该主机,则会引入很长的延迟,直到调用超时失败。申请将很快开始。

如何避免这个问题,几种解决方法:

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

13
投票

MinGW 上的许多“unixy”东西都慢得令人痛苦,因为 Windows 没有

fork()
。 Windows只有
CreateProcess()
,这是很不一样的。 Unix shell 和 GNU Make 进行了大量的分叉,因此在 MinGW 下运行这些会导致“模拟”分叉,这非常慢。

另一个受此困扰的是 GNU Autotools,因此在从源代码构建“unixy”应用程序时运行

./configure
脚本也非常慢。如果您需要多次执行此操作,这可能会变得非常烦人(例如,在使用 configure 查找所有库时遇到麻烦)。

这个答案更详细地解释了Cygwin和MinGW如何用来模拟fork()

,并且
这个答案有更多最新的解释。


-1
投票
您可以尝试使用更新版本的工具集。我发现这很有用:

http://nuwen.net/mingw.html 它在一个大包中包含 MinGW 使用的所有工具和通用 API。 来自网站:

我的 MinGW 发行版(“发行版”)是 x64 原生的,当前包含 GCC 6.1.0 和 Boost 1.61.0。

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

© www.soinside.com 2019 - 2024. All rights reserved.