2014-12-13 2 views
1

Я автоматически создал огромный, но очень простой .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 минут назад, и это продолжается до сих пор. Есть ли способ достичь того, чего я хочу, и сократить время компиляции? Почему это так долго? Я видел довольно много библиотек с 3k-5k строк обычного кода, даже с шаблонами, и он скомпилировался очень быстро.

Нижняя строка. Я не хочу помещать свои данные в файл ресурсов и анализировать этот файл, я хотел бы скомпилировать данные непосредственно в двоичный файл.

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

+1

@MrEricSir Почему вы думаете, что это переполнило бы стек? Нет ничего, указывающего, что код называется _recursively_. –

+0

Нет, конечно, не будет переполнения стека. Во всяком случае, он будет работать медленно. –

+0

Какой компилятор вы используете ([GCC] (http://gcc.gnu.org/) или [Clang/LLVM] (http://clang.llvm.org/)), какая версия ('g ++ 4.9'?)? какие флаги оптимизации? –

ответ

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"), а 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 -s во время выполнения.

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

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

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

+0

Это не может быть C, потому что строки должны быть UTF-8, там могут быть всевозможные символы без ASCII, поэтому я должен зависеть от Qt для обработки строк. Но я все еще могу попробовать ваши предложения и использовать 'QString' вместо' char * '. –

+0

И, конечно, есть вопрос, насколько переносимым является мой код, так как я все еще передаю не-ASCII-символы как 'char *', но он работает в Visual Studio в кодированном UTF-8 источнике. –

 Смежные вопросы

  • Нет связанных вопросов^_^