我正在编写一个最终生成C ++代码的编译器。我目前想知道什么是更快的编译。
关于编译器的第一个注释:
#include <vector>
之类的内容,当我必须使用库中的printf
等函数时,我手动放置原型。 (编译器手动执行。)我有两个选择:
选项#1:
//.h
#include "A.h"
#include "B.h"
int function( /* parameters */ );
//.cpp
int function( /* parameters */ ) {
// code
}
每个函数都有自己的源代码和标题。 优点:
#include "B.h"
中包含#include "A.h"
的内容,那么我可以将其注释掉#include "B.h"
行。 (保存文件读取。)选项#2:
int function( /* parameters */ );
int function2( /* parameters */ );
int function3( /* parameters */ );
// ...
int function( /* parameters */ ) {
// code
}
// ...
所有函数一旦定义(那些原型在顶部)并在该单个文件中编译。
优点:
乍一看,选项#1看起来更快,但是有些人说他们尝试了第二次,这使得他们的项目在编译时间方面得到了提升。他们没有比较两种选择,也没有给出任何证据。
我能解释哪一个更快而不是基准吗?
答案 0 :(得分:2)
众所周知,C ++编译速度很慢,特别是因为标准C ++头文件(例如<vector>
,<map>
或其他标准容器)带来了很多的C ++代码(和令牌)通过内部标题。
您的#include
- d标头机是生成的,还是它们都是运行时共有的?您可以考虑使用单个标头并对其进行预编译(假设最近的 GCC或Clang/LLVM编译器),请参阅this 。然后,您需要在每个生成的C ++文件的顶部只有一个#include
。
最后,当您生成C(以及生成正版 C ++时更多)时,您真的希望C或C ++编译器优化生成的C或C ++代码。解析生成的代码的时间并不重要(您可以尝试-ftime-report选项来衡量g++
占用时间的位置。最新的GCC 5.1有libgccjit,您可能会感兴趣。
答案 1 :(得分:2)
最重要的因素之一是并行编译的能力。由于每个翻译单元都是以顺序方式编译的(至少在逻辑上),如果您只为一个大文件提供C ++编译器,则并行化的机会有限。
正如所指出的,平衡力是每个编译的启动成本。您有多个CPU核心会产生相同的启动成本。
因此,当添加额外的翻译单元时,并行化不再是一个胜利,而是通过使用额外的核心来节省更多的开销。