Автоматически сгенерированный файл.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 тыс. Строк обычного кода, даже с шаблонами, и он компилировался очень быстро.

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

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

1 ответ

Решение

По опыту (в MELT, с недавним GCC -eg 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 внутри).

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

Другие вопросы по тегам