我有一个用C / C ++编写的控制台应用程序。即使优化标志设置为-o3
,通常在非Windows平台上编译需要5-10分钟。但是,当在Visual Studio中将优化标志设置为Full Optimization (/Ox)
并将内联函数扩展设置为Any Suitable (/Ob2)
时,在Windows平台上编译大约需要1-2小时。这在发布/调试模式下都会发生。
我理解编译器正在尝试优化代码,因此它需要花费更多时间,但与非Windows平台上其他编译器(主要是g ++)所花费的时间相比,它不会太多时间。
到目前为止,我试过了..
从源文件和头文件中删除不必要的标头,尽可能引入前向声明,但没有喘息的机会。
我分析了所有头文件。项目中~50个头文件中的2-3个头文件几乎不使用模板。这些标头也未广泛包含在源文件中。
我从这种行为中得出两个观察结果 -
源代码中没有任何可怕的错误,否则非Windows平台上的编译器将无法如此快速地完成。
似乎VS编译器真正需要花费更多时间(1-2小时),其他编译器可以在(10分钟)内完成,但VS编译器可能不那么糟糕。因此,我必须缺少改变一些配置(除了优化)。
有谁知道如何找出这里出了什么问题?可能是起点将确定每个文件所采用的编译时间。如何查找每个文件的编译时间?
如果我还能改进/尝试某些东西,是否有可能?
以下是部分评论中所要求的有关硬件,源代码等的其他详细信息
RAM - 8.0 GB RAM
操作系统 - Windows 7 64位
处理器 - 英特尔酷睿i5 2.6 GHz
Visual Studio - 2013 Ultimate
注意 - 如果我禁用优化(set /Od and /Ob0 flags in VS)
,则程序在同一台计算机上的编译时间不到5分钟。
源文件 - 大约55个,每个头文件和源文件以及80KLOC代码。
答案 0 :(得分:0)
有没有人知道从哪里开始找出这里出了什么问题?
不是没有更多细节。
如果我还能改进/尝试某些东西,是否有可能?
是。特别要考虑:
从头文件中删除任何模板化代码(包含在.h文件中并在其中定义),并通过pimpl访问该代码(因为模板会在每次传递时重新评估)。
优化预编译标头的使用
将控制台应用程序拆分为单独的模块(因此构建系统只会在构建时更新脏二进制文件)
答案 1 :(得分:0)
根据评论中收到的建议,我首先找出每个文件的编制时间:
当我打开源文件时,我发现代码中的某些错误与我的观察相反。它是27KLOC的巨大怪物文件(Opps!,当然我没有写这个文件)。 动态创建并分配给数组的类有739个实例。每个实例依次动态创建一些成员。简而言之,在这个文件中创建了数千个对象。
确保此文件是罪魁祸首,VS工作室正在采取过多优化此文件的方式。我禁用了优化 在这个文件中由@Predelnik在评论中提出。瞧!程序现在在几分钟内编译。此源代码需要严格的重新分解。
如果有人遇到这样的问题,我会按照以下方式进行 -