【发布时间】:2015-03-10 12:24:39
【问题描述】:
我有一个用 C/C++ 编写的控制台应用程序。即使优化标志设置为-o3,通常也需要 5-10 分钟才能在非 Windows 平台上编译。但是在 Windows 平台上编译需要大约 1-2 小时在 Visual Studio 中将优化标志设置为 Full Optimization (/Ox) 并且将内联函数扩展设置为 Any Suitable (/Ob2)。这在发布/调试模式下都会发生。
我了解编译器正在尝试优化代码,因此它肯定会花费更多时间,但与非 Windows 平台上的其他编译器(主要是 g++)所花费的时间相比,它不是太多时间。
到目前为止我试过了..
从源文件和头文件中删除了不必要的头文件,尽可能地引入前向声明,但没有喘息的机会。
我分析了所有的头文件。项目中约 50 个头文件中的 2-3 个头文件几乎不使用模板。这些头文件也没有广泛包含在源文件中。
我对这种行为有两个观察结果 -
源代码中没有什么严重的错误,否则非 Windows 平台上的编译器将无法如此快速地完成。
似乎 VS 编译器确实需要更多时间(1-2 小时),而其他编译器能够在(10 分钟)内完成,但 VS 编译器不会那么糟糕。因此,我必须改变一些配置(除了优化)。
有谁知道如何找出这里出了什么问题?可能的起点是确定每个文件所花费的编译时间。如何找到每个文件的编译时间?
如果我仍然可以改进/尝试某些东西,是否有可能?
这里是一些 cmets 要求的有关硬件、源代码等的其他详细信息
内存 - 8.0 GB 内存
操作系统 - Windows 7 64 位
处理器 - Intel Core i5 2.6 GHz
Visual Studio - 2013 Ultimate
注意 - 如果我禁用优化 (set /Od and /Ob0 flags in VS),那么程序在同一台机器上的编译时间不到 5 分钟。
源文件 - 大约 55 个,每个头文件和源文件以及 80KLOC 代码。
【问题讨论】:
-
请指定以下内容:大约文件数; Windows 机器的相关硬件规格(处理器、RAM)
-
嗯,这很不寻常。然而,这不是你应该等待的东西。构建发布版本是构建服务器的工作。它只是奴役它,没有人等待它。
-
是 C 还是 C++ 还是两者的混合?一个可能的问题是其他编译器将 C 编译为 C,而 MSVC 可能将其编译为 C++。 C++ 编译器因要花很长时间编译东西而臭名昭著。
-
测量每个文件的构建时间的另一种方法:删除所有目标文件 - 构建程序。测量每个目标文件的最后更改时间和创建时间之间的差异(可以使用一些脚本语言来完成)。当您找到罪魁祸首文件时,如果不需要优化,有时在整个文件或某些函数上创建
#pragma optimize ("g", off)会有所帮助。
标签: c++ c windows visual-studio optimization