您是否有任何提示可以真正加快大型C 源代码?
我与最后一个Visual Studio 2013编译器编辑了QT5,这至少花费了3个小时,而Intel Quad Core 3.2GHz,8GB内存和SSD驱动器。
如果我想在30分钟内执行什么解决方案?
谢谢。
正向声明和pimpl。
示例.h:
// no include
class UsedByExample;
class Example
{
// ...
UsedByExample *ptr; // forward declaration is good enough
UsedByExample &ref; // forward declaration is good enough
};
示例.cpp:
#include "used_by_example.h"
// ...
UsedByExample object; // need #include
一个鲜为人知/未使用的事实是,远期声明也足以函数返回值:
class Example;
Example f(); // forward declaration is good enough
只有调用f()
的代码,并且必须在返回的Example
对象上操作实际上需要Example
的定义。
PIMPL的目的是一个习语,具体取决于远期声明,是将私人成员完全隐藏在外部汇编单元中。因此,这也可以减少编译时间。
所以,如果您有此类:
示例.h:
#include "other_class.h"
#include "yet_another_class.h"
#include "and_yet_another_class.h"
class Example
{
// ...
public:
void f();
void g();
private:
OtherClass a;
YetAnotherClass b;
AndYetAnotherClass c;
};
您实际上可以将其变成两个类,一个是实现,另一个是接口。
示例.h:
// no more includes
class ExampleImpl; // forward declaration
class Example
{
// ...
public:
void f();
void g();
private:
ExampleImpl *impl;
};
example_impl.h:
#include "other_class.h"
#include "yet_another_class.h"
#include "and_yet_another_class.h"
class ExampleImpl
{
// ...
void f();
void g();
// ...
OtherClass a;
YetAnotherClass b;
AndYetAnotherClass c;
};
缺点可能包括更高的复杂性,内存管理问题和附加的间接层。
-
使用快速的SSD设置。甚至可以在系统上创建RAM磁盘。
-
project->属性 ->配置属性 -> c/c ->常规 ->多处理器编译:是(/MP)
-
工具 ->选项 ->项目和解决方案 ->构建和运行:并设置并行项目构建的最大数量。(在我的系统上已经设置为8,可能是在VS2013的第一次运行中确定的)
-
减少依赖的数量,因此,如果代码的一部分更改,则不必重新编译其余部分。IE。更改标头时,任何包含特定标头的.CP/.CPP/.CC文件都需要重新编译。因此,如果可以的话,请前进的东西。
-
避免尽可能多地编译。如果有您不需要的模块,请将它们排除在外。如果您的代码很少更改,请将其放在静态库中。
-
不要使用过多的模板。编译器必须生成每个版本的模板的新副本,并且模板的所有代码都在标题中,并且需要一遍又一遍地重新阅读。这本身不是问题,而是向前删除,和添加依赖项的相反。
-
如果您的标题每个文件都使用,并且很少会更改,请查看是否可以将它们放入预编译的标题中。一个预编译的标头仅进行一次编译,并以适合读取的编译器的格式保存,因此对于使用的类,可以带来很大的加速。
请注意,这仅适用于您编写的代码。对于来自第三方的代码,只有#2和#4可以提供帮助,但不会将绝对编译时间提高太多,仅在建造一次后才需要分析代码的数量。
实际上使事情更快,您的选择更加有限。您已经有了SSD,因此您可能不再绑定硬盘,并且与SSD交换也应该更快,因此RAM可能不是最紧迫的问题。因此,您可能是CPU的。
有几个选项:
1:您可以制作1个(或几个).cpp文件,其中包括项目中的大量CPP文件然后,您仅编译这些文件并忽略其余的文件。
优点:
-
在一个Machiene上的汇编
要快得多 应该已经有工具为您生成这些文件。无论如何,技术真的很简单,您可以构建一个简单的脚本来解析项目文件和编译单元,此后您只需要将这些文件包括在项目中,而忽略其余文件
缺点:
-
更改一个CPP文件将触发包括该CPP文件的重建,对于loger进行编译时所需的次要更改
-
您可能需要更改一些代码才能使其正常工作,例如,它可能无法使用,例如,如果您在两个不同的CPP文件中具有相同名称的函数,则需要更改该函数。
2:使用Incredibuild之类的工具
优点:
-
为您的项目开箱即用。安装该应用程序,您已经可以编译项目
-
汇编也确实很快,即使对于小更改
缺点:
-
不是免费的
-
您将需要更多的计算机来实现Speadup
您可能会找到选项2的替代方案,这是一个相关的问题。改善汇编时间的其他技巧是将CPP文件中的大部分代码移动,并避免内联声明。还广泛使用元编程,增加了构建时间。
只需找到瓶颈,然后改进PC的那部分即可。例如,HDD/SSD性能通常是瓶颈。
在代码方面,请使用诸如前向声明之类的事物避免在可能的情况下包括标题,从而进一步改善汇编时间。
不要使用模板。真的。如果您使用的每个类都是模板(如果所有课程都是类),则只有一个翻译单元。因此,您的构建系统无能为力,仅将编译减少到实际需要重建的少数部分。
如果您有大量的模板类,但是相当数量的未模拟类,则情况并不多:任何在一个以上的汇编单元中使用的模板类都必须汇编几次!
当然,您不想扔掉小的,有用的模板辅助类别,但是对于所有编写的代码,您应该三思而后行,然后再制作模板。特别是,您应该避免使用模板用于使用五个不同的模板类的复杂类。您的代码实际上可能从中获得更多可读性。
如果您想进行激进,请在C中写入C。>
除了之前所说的话,您还应该避免这样的事情:
1.动态结合。它越复杂,编译器必须做的工作越多。
2.高水平的优化:使用优化代码(O x
)为某个体系结构进行编译。
感谢您的所有答案。
我必须启用Multicores编译,并在任何地方进行一些优化。
大部分时间成本是由于模板。
谢谢。