加速极慢的 MinGW-w64 compilation/linking?
Speed up extremely slow MinGW-w64 compilation/linking?
我怎样才能加速 MinGW-w64 的极其 缓慢的 C++ compilation/linking?
编译一个简单的 "Hello World" 程序:
#include <iostream>
int main()
{
std::cout << "hello world" << std::endl;
}
...在这个未加载的 Windows 10 盒(i7-6700、32GB RAM、体面的 SATA SSD 上花费 3 分钟(!) ):
> ptime.exe g++ main.cpp
ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>
=== g++ main.cpp ===
Execution time: 180.488 s
Process Explorer 显示 g++
进程树在 ld.exe
中触底,在持续时间内没有使用任何明显的 CPU 或 I/O。
运行 通过 API Monitor 的 g++
进程树显示 ld.exe
中有三个异常长的系统调用:两个 NtCreateFile()
和一个 NtOpenFile()
,每个操作在 a.exe
上进行,每个操作花费 60 秒。
只有在使用默认 a.exe
输出时才会出现缓慢; g++ -o foo.exe main.cpp
需要 2 秒,最高。
"Well don't use a.exe
as an output name then!" 并不是真正的解决方案,因为这种行为会导致 CMake 花费很长时间进行编译器功能检测。
GCC 工具链版本:
>g++ --version
g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
>ld --version
GNU ld (GNU Binutils) 2.30
鉴于我无法在干净的 Windows 10 VM 中重现问题,并且对输出文件名的依赖使我走上了 anti-virus/anti-malware 干扰之路。
fltmc instances
listed several possible filesystem filter drivers; guess-n-check narrowed it down to two of Carbon Black 的:carbonblackk
& ParityDriver
.
使用 Regedit 通过将 Start
设置为 0x4
("Disabled"、0x2
== 自动、0x3
== 手动)来禁用它们两个注册表项,然后重新启动修复了缓慢问题:
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\carbonblackk
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ParityDriver
我怎样才能加速 MinGW-w64 的极其 缓慢的 C++ compilation/linking?
编译一个简单的 "Hello World" 程序:
#include <iostream>
int main()
{
std::cout << "hello world" << std::endl;
}
...在这个未加载的 Windows 10 盒(i7-6700、32GB RAM、体面的 SATA SSD 上花费 3 分钟(!) ):
> ptime.exe g++ main.cpp
ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>
=== g++ main.cpp ===
Execution time: 180.488 s
Process Explorer 显示 g++
进程树在 ld.exe
中触底,在持续时间内没有使用任何明显的 CPU 或 I/O。
运行 通过 API Monitor 的 g++
进程树显示 ld.exe
中有三个异常长的系统调用:两个 NtCreateFile()
和一个 NtOpenFile()
,每个操作在 a.exe
上进行,每个操作花费 60 秒。
只有在使用默认 a.exe
输出时才会出现缓慢; g++ -o foo.exe main.cpp
需要 2 秒,最高。
"Well don't use a.exe
as an output name then!" 并不是真正的解决方案,因为这种行为会导致 CMake 花费很长时间进行编译器功能检测。
GCC 工具链版本:
>g++ --version
g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
>ld --version
GNU ld (GNU Binutils) 2.30
鉴于我无法在干净的 Windows 10 VM 中重现问题,并且对输出文件名的依赖使我走上了 anti-virus/anti-malware 干扰之路。
fltmc instances
listed several possible filesystem filter drivers; guess-n-check narrowed it down to two of Carbon Black 的:carbonblackk
& ParityDriver
.
使用 Regedit 通过将 Start
设置为 0x4
("Disabled"、0x2
== 自动、0x3
== 手动)来禁用它们两个注册表项,然后重新启动修复了缓慢问题:
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\carbonblackk
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ParityDriver