当使用许多外部类型声明时,如何加快编译时间?
How can I speed up compile time when using many extern type declarations
项目:
c++ Programming in xcode我有3000多个类型定义,分布在2000多个。c/。h文件中。每种myType
类型都包含一个字符串描述。我使用脚本在.cpp
文件中定义3000 +元素的map<std::string, myType>
,用于查找myType
类型以传递给处理基于myType
传递给它的数据的函数。因为myType
的定义分布在2000多个文件中,所以我使用了一个脚本来在头文件中编写每个extern myType TYPENAME;
。
概述:
(2000 +具有myType
定义的.c
文件)
myTypes.h
(包含上述文件中每个myType
的所有外部myType
语句)
myTypes.cpp
(包含上述文件中3000多个元素的map<std::string, myType>
)
typeProcessor.cpp
(包括myTypes.h
)。使用myTypes.cpp
中定义的映射将字符串匹配到myType
。将myType
从下面的文件传递给一个函数)
dataProcessor.cpp
(根据传递给它的myType
处理数据)
问题:
由于我添加了myTypes.h
与3000 + extern语句和myTypes.cpp
与3000 +元素的映射,我的项目编译时间从20秒延长到1-1.5小时。
我的问题:
在不触及2,000多个文件或接收myType
的dataProcessor.cpp
的情况下,我可以做些什么来减少编译时间?
我的一些想法:
-
使用脚本将所有
myType
定义放入一个大的myTypes.cpp
文件中,并删除外部语句。或 -
使用脚本
#include
每个包含myType
定义的2000多个文件
我不太了解编译器,编译时间的主要因素,以及如何编写代码来最小化编译时间。任何帮助都是感激的。谢谢你。
不管你可以做很多事情来更好地构建你的代码,为什么你不
- 创建一个公共静态注册函数,例如(typemap.h)
.
std::map<std::string, myTypeBase>& getGlobalTypeMap();
# define getGlobalTypeMap _once_ in typemap.cpp !
template <class myType>
registerTypeMapping(std::string name, const myType& instance)
{
getGlobalTypeMap().insert(name, instance);
}
在类型定义的每个.cpp中,调用注册函数。通过这种方式,类型注册自己,并且不需要类型映射"知道所有类型"。这是依赖倒置,以一个简单的形式
关键是,没有文件需要包含注册过程中的所有类型头文件。如果你需要特定于子类型的接口(例如,当在地图元素上使用
dynamic_cast<subtype>
时),你仍然需要包括(选定的)类型标题
p。我假设myType有某种共同的基本类型(因为没有办法让std::map<std::string, myType>
编译)
编辑
- 是的,您可以使
registerTypeMapping
和extern "C"
函数(只需编辑原型使其符合c) - 对于每个
type_xx.h/type_xx.c
组合,您总是可以生成一个额外的源文件type_xx_register.c
,其中包含只是该类型并注册它。
注意,这将导致更多的源,但可能会减少编译时间。特别是,如果您有一个makefile,并且只在type_xx_register.o
对象文件的依赖关系真正改变时才编译它。
这样,只有在typemap.h
中进行更改才会导致重新编译所有这些文件。
<子>一个简单的子>
$CC type*_register.cpp -o
_会比一次性编译包含所有type_xx.h的单个源代码_要快
由于所有这些文件都没有发生太大变化(我假设),因此要么是解析3000多行头文件,要么是链接,这会消耗编译时间。如果它是解析,预编译头应该解决这个问题,如果它是链接,像Visual Studio的增量链接应该有所帮助,但我不认为任何编译器除了MSVC有这个能力(纠正我,如果我错了)。
这可能会阻止保存这3,000个文件
与xcode的autosave方法相反
这个autosave off
选项(非常愚蠢)在新版本的xcode(3.1是一个坚实的xcode)中缺失,因此所有文件都得到一个新的时间戳,然后相当于一个干净的所有重建。
尝试make
在命令行上不保存文件作为速度比较