Windows系统下MinGW环境的gfortran编译程序运行极慢是什么原因?
问题原因分析
首次运行耗时远高于后续运行的核心原因
- 杀毒软件实时扫描:Windows Defender或第三方杀毒软件会对首次运行的未知二进制文件执行全量安全扫描,覆盖程序本身、所有依赖的动态链接库,扫描完成后会将该程序加入缓存白名单,后续运行无需重复扫描,耗时直接下降。
- Windows系统缓存机制:SysMain(原超级预取)服务会在程序首次运行时,将其依赖的dll、运行所需资源预加载到内存缓存中,后续启动时直接从内存读取,无需再从磁盘加载、完成dll重定位等操作,启动速度大幅提升。
- 程序兼容性检测:Windows的程序兼容性助手会对首次运行的未知程序执行后台兼容性校验,该过程也会占用大量时间。
1s以上运行耗时异常的排查方向
按优先级从高到低依次排查:
- 杀毒软件验证:临时关闭杀毒软件的实时保护功能,多次运行程序测试耗时,如果耗时降至100ms以内,即可确认是杀毒扫描导致的问题。解决方法是将MinGW安装目录、存放编译产出的工作目录加入杀毒软件的排除扫描列表。
- 动态链接依赖排查:使用Dependencies工具查看编译出的
hello.exe依赖的所有dll加载路径,检查是否存在路径过深、优先级过低导致的查找耗时,或者加载了非MinGW目录下的异常依赖dll。也可以尝试静态编译测试:
执行编译命令gfortran -static helloworld.f90 -o hello_static,运行静态编译后的程序,如果耗时正常,说明是动态链接阶段的路径查找耗时过高,可将MinGW的bin目录调整到PATH环境变量的靠前位置,减少dll查找遍历的目录数。 - 存储位置排查:检查当前工作目录是否属于同步盘(OneDrive、各类云同步目录)、加密磁盘或者网络映射盘,这类存储位置的文件读写会被额外的中间层拦截,导致启动耗时升高,将exe移动到本地普通目录(如
C:\temp)测试即可验证。 - 系统安全策略排查:检查是否开启了Windows Defender的攻击面减少(ASR)规则、受控文件夹访问等安全策略,这类策略会对所有程序的运行做额外校验,可临时关闭后测试耗时变化。也可以尝试以管理员身份启动命令提示符后运行程序,排除UAC权限校验导致的耗时。
- MinGW版本验证:如果以上排查都无效,可能是当前安装的MinGW版本存在兼容性bug,可以尝试卸载现有版本,安装最新的MinGW-w64版本后重新编译测试。
内容的提问来源于stack exchange,提问作者user9393931
相关产品推荐
相关产品推荐

