我已经自动生成了一个巨大但非常简单的.cpp文件。它定义了一个类:
#include <QString>
#include <map>
class CTrigramFrequencyTable_English
{
public:
CTrigramFrequencyTable_English();
private:
std::map<QString /*trigram*/, quint64 /*count*/> _trigramFrequencyTable;
const quint64 _totalTrigramCount;
};
并在构造函数中放入以下类型的10k行:
_trigramFrequencyTable[QString("and")] = 48760ull;
我已经开始在大约10分钟前编译这个.cpp了,而且它还在继续。有没有办法实现我想要的并减少编译时间?为什么这么长时间?我已经看到很多具有3k-5k行常规代码的库,即使是模板,也可以非常快速地编译。
底线 - 我不想将我的数据放入资源文件并解析该文件,我想将数据直接编译成二进制文件。
P上。在调试配置中,S. 10k行文件在大约30秒内编译;在发布中我等了10分钟并终止了这个过程。
答案 0 :(得分:4)
根据经验(在MELT中,使用最近的GCC -eg 4.8或4.9)生成的C ++(类似于C的)代码,例程的编译时间是二次大小(在数量上)只要您希望编译器进行优化,就可以使用该例程。
任何optimizing compiler内的寄存器分配和指令调度算法都很复杂!
在您的特定情况下,您应该考虑更改C ++代码生成脚本以发出类似:
的内容struct my_trigram_pair_st {
const char*name;
unsigned long long freq;
};
const struct my_trigram_pair_st my_trigrams[]= {
{ "and", 48760ull },
// zillions of similar lines
{ NULL, NULL }
};
并且最好将其作为C(而不是C ++)代码发出。 可以是C代码,因为const char*
是一个普通的C字符串(对于文字字符串,如"and"
),{{1}是一个简单的数字。更改您的生成器以发出合法的C99字符串(因此不要在内部发出freq
,但Ô
或最好\303\224
...)
然后,调整您的C ++程序使用:
\xc3\x94
您要在运行时将UTF8 extern "C" const struct my_trigram_pair_st my_trigrams[];
for (int i=0; my_trigrams[i].name != nullptr; i++)
_trigramFrequencyTable[QString(my_trigrams[i].name)]
= my_trigrams[i].freq;
转换为const char*
- 。
如果您需要脚本来生成函数,请让您的脚本将这些函数拆分为较小的函数(例如每行最多一千行)。
或者将您的大量数据放在例如一些Sqlite和/或Json文件....(你甚至可以在里面有一些带JSON的Sqlite文件)。
您还可以在编译特定文件时禁用编译器中的优化....或者您可以等待更长时间(小时)。