Автоматически сгенерированный файл .cpp компилируется очень долго

Я автоматически сгенерировал огромный, но очень простой файл .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;

Я начал компилировать этот .cpp около 10 минут назад, и он все еще продолжается. Есть ли способ добиться того, чего я хочу, и сократить время компиляции? Почему это так долго? Я видел довольно много библиотек с 3–5 тыс. Строк обычного кода, даже с шаблонами, и он компилировался очень быстро.

Итог — я не хочу помещать свои данные в файл ресурсов и анализировать этот файл, я хотел скомпилировать данные непосредственно в двоичный файл.

Файл P.S. 10k строк компилируется за 30 секунд в конфигурации отладки; в выпуске я подождал 10 минут и остановил процесс.

1

Решение

По опыту (в ПЛАВИТЬСЯ, с недавним НКУ -например 4.8 или 4.9) с сгенерированным кодом C ++ (вроде C), время компиляции подпрограммы имеет квадратичный размер (по числу строк) этой подпрограммы, как только вы захотите оптимизировать компилятор.

Регистрируйте алгоритмы распределения и планирования команд внутри любого оптимизирующий компилятор сложны и сложны!

В вашем конкретном случае вам следует подумать об изменении сценария генерации кода на 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") и freq это простое число. Также измените ваш генератор, чтобы он испускал допустимые строки C99 (так что не выбрасывайте Ô внутри, но \303\224 или предпочтительно \xc3\x94 …)

Затем настройте свою программу на C ++, чтобы использовать это:

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;

Вот вы конвертируете UTF8 const char* в QString-с во время выполнения.

Если вам нужен ваш скрипт для генерации функции, Сделайте так, чтобы ваш скрипт разбивал эти функции на более мелкие функции (например, не более тысячи строк каждая).

Или же поместите ваши огромные данные, например, в немного Sqlite и / или Json файл …. (вы могли бы даже иметь некоторый файл Sqlite с JSON внутри).

Вы также можете отключить оптимизацию в вашем компиляторе при компиляции этого конкретного файла …. Или вы можете ждать намного дольше (часы).

4

Другие решения