MSVC开启优化后单个cpp文件编译超20分钟未完成,如何定位耗时函数
MSVC下C++单文件优化编译耗时过长的定位方案
低开销编译器定位选项
无需开启全量Diagnostic日志,使用以下专属编译选项即可精准定位耗时点,不会触发内存不足问题:
- 添加
/d2cgsummary选项:编译结束后会输出所有函数的代码生成、优化阶段的耗时、生成代码体积等统计信息,是定位慢函数的首选参数,可以直接在项目属性→C/C++→命令行→附加选项中添加 - 搭配
/Bt+选项:输出编译全流程各阶段(前端语法解析、后端优化、代码生成)的总耗时,先确认耗时是否集中在后端优化环节 - 若怀疑是模板展开导致的卡顿,添加
/d1templatesummary选项:会输出所有模板的实例化次数、总耗时统计,快速定位高负载模板定义
极端场景下的二分排查法
如果编译全程卡死无法输出上述统计,可以用代码二分法快速缩小范围:
- 每次注释掉当前CPP文件内约一半的函数、模板实例化代码
- 重新编译观察耗时是否恢复正常
- 多次迭代后即可定位到触发卡顿的具体代码,常见诱因包括嵌套过深的constexpr计算、超大规模模板元编程、编译器自动多层循环展开、大量SIMD自动向量化场景等
临时修复方案
定位到具体慢函数后,可以给该函数添加__declspec(optimize("", off))前缀,单独关闭该函数的优化,既不影响项目其他代码的优化收益,也能直接解决编译耗时过长的问题
内容的提问来源于stack exchange,提问作者Kumputer
相关产品推荐
相关产品推荐

