У меня есть автоматически сгенерированный файл, который выглядит примерно так...
static void do_SomeFunc1(void* parameter)
{
// Do stuff.
}
// Continues on for another 4000 functions...
void dispatch(int id, void* parameter)
{
switch(id)
{
case ::SomeClass1::id: return do_SomeFunc1(parameter);
case ::SomeClass2::id: return do_SomeFunc2(parameter);
// This continues for the next 4000 cases...
}
}
Когда я создаю его как это, время изготовления огромно. Если я встраиваю все функции автоволшебно в их соответствующие случаи с помощью моего сценария, время изготовления сокращается в половине. GCC 4.5.0 говорит, что ~50% времени изготовления поднимается "отслеживанием переменной", когда я использую - ftime-отчет. Что это означает и как я могу ускорить компиляцию, все еще поддерживая превосходящую местность кэша вытаскивания функций от переключателя?
Править: Интересно достаточно время изготовления взорвалось только на сборках отладки согласно следующей профильной информации целого проекта (который не является просто рассматриваемым файлом, но и все еще хорошая метрика; файл рассматриваемые взятия большая часть времени для создания):
Если Вам любопытно, вот являются некоторые демонстрационным do_func, удаленный контекст. Как Вы видите, я упростил проблемное определение немного, чтобы только показать соответствующие части. В случае, если Вы задаетесь вопросом, весь само-> func вызовы вызовы для повышения:: сигнал.
static void do_Match_Login(Registry* self, const uint8_t* parameters, uint16_t length)
{
const uint8_t* paramPtr = parameters;
std::string p0 = extract_string(parameters, ¶mPtr, length);
std::string p1 = extract_string(parameters, ¶mPtr, length);
int32_t p2 = extract_int32(parameters, ¶mPtr, length);
uint32_t p3 = extract_uint32(parameters, ¶mPtr, length);
tuple<Buffer, size_t, size_t> p4 = extract_blob(parameters, ¶mPtr, length);
return self->Match_Login(p0, p1, p2, p3, p4);
}
static void do_Match_ResponseLogin(Registry* self, const uint8_t* parameters, uint16_t length)
{
const uint8_t* paramPtr = parameters;
int32_t p0 = extract_int32(parameters, ¶mPtr, length);
std::string p1 = extract_string(parameters, ¶mPtr, length);
array<uint16_t, 3> p2 = extract_vector(parameters, ¶mPtr, length);
std::string p3 = extract_string(parameters, ¶mPtr, length);
uint8_t p4 = extract_uint8(parameters, ¶mPtr, length);
uint8_t p5 = extract_uint8(parameters, ¶mPtr, length);
uint64_t p6 = extract_MUID(parameters, ¶mPtr, length);
bool p7 = extract_bool(parameters, ¶mPtr, length);
tuple<Buffer, size_t, size_t> p8 = extract_blob(parameters, ¶mPtr, length);
return self->Match_ResponseLogin(p0, p1, p2, p3, p4, p5, p6, p7, p8);
}
Вы можете отключить отслеживание переменных. Отслеживание переменных используется для того, чтобы сделать отладочную информацию немного более ценной, но если этот код генерируется автоматически, и вы не собираетесь его отлаживать, то это не очень полезно. Вы можете просто отключить его только для этого файла.
gcc -fno-var-tracking ...
Должно получиться. Как я уже сказал, я думаю, вы можете сделать это только для этого файла.