自动生成的.cpp文件需要很长时间才能编译

时间:2014-12-13 19:42:22

标签: c++ qt compilation compilation-time

我已经自动生成了一个巨大但非常简单的.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分钟并终止了这个过程。

1 个答案:

答案 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文件)。

您还可以在编译特定文件时禁用编译器中的优化....或者您可以等待更长时间(小时)。