如何加快C 汇编



您是否有任何提示可以真正加快大型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的第一次运行中确定的)

  1. 减少依赖的数量,因此,如果代码的一部分更改,则不必重新编译其余部分。IE。更改标头时,任何包含特定标头的.CP/.CPP/.CC文件都需要重新编译。因此,如果可以的话,请前进的东西。

  2. 避免尽可能多地编译。如果有您不需要的模块,请将它们排除在外。如果您的代码很少更改,请将其放在静态库中。

  3. 不要使用过多的模板。编译器必须生成每个版本的模板的新副本,并且模板的所有代码都在标题中,并且需要一遍又一遍地重新阅读。这本身不是问题,而是向前删除,添加依赖项的相反。

  4. 如果您的标题每个文件都使用,并且很少会更改,请查看是否可以将它们放入预编译的标题中。一个预编译的标头仅进行一次编译,并以适合读取的编译器的格式保存,因此对于使用的类,可以带来很大的加速。

请注意,这仅适用于您编写的代码。对于来自第三方的代码,只有#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编译,并在任何地方进行一些优化。

大部分时间成本是由于模板。

谢谢。

相关内容

  • 没有找到相关文章

最新更新