"отслеживание переменных" пожирает мое время компиляции!

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

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-report. Что это значит и как я могу ускорить компиляцию, сохраняя при этом превосходную локальность кэша, извлекая функции из коммутатора?

РЕДАКТИРОВАТЬ: Достаточно интересно, что время сборки взорвалось только на отладочных сборках, в соответствии со следующей информацией профилирования всего проекта (который не только файл, о котором идет речь, но все же хорошая метрика; рассматриваемый файл занимает больше времени строить):

  • Отладка: 8 минут 50 секунд
  • Релиз: 4 минуты 25 секунд

Если вам интересно, вот несколько примеров do_func, контекст удален. Как видите, я немного упростил определение проблемы, чтобы показать только соответствующие части. Если вам интересно, все вызовы self->func - это вызовы boost::signal.

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, &paramPtr, length);
    std::string p1 = extract_string(parameters, &paramPtr, length);
    int32_t p2 = extract_int32(parameters, &paramPtr, length);
    uint32_t p3 = extract_uint32(parameters, &paramPtr, length);
    tuple<Buffer, size_t, size_t> p4 = extract_blob(parameters, &paramPtr, 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, &paramPtr, length);
    std::string p1 = extract_string(parameters, &paramPtr, length);
    array<uint16_t, 3> p2 = extract_vector(parameters, &paramPtr, length);
    std::string p3 = extract_string(parameters, &paramPtr, length);
    uint8_t p4 = extract_uint8(parameters, &paramPtr, length);
    uint8_t p5 = extract_uint8(parameters, &paramPtr, length);
    uint64_t p6 = extract_MUID(parameters, &paramPtr, length);
    bool p7 = extract_bool(parameters, &paramPtr, length);
    tuple<Buffer, size_t, size_t> p8 = extract_blob(parameters, &paramPtr, length);

    return self->Match_ResponseLogin(p0, p1, p2, p3, p4, p5, p6, p7, p8);
}

3 ответа

Решение

Вы можете отключить отслеживание переменных. Отслеживание переменных используется для того, чтобы сделать отладочную информацию более ценной, но если этот код генерируется автоматически, и вы не собираетесь его много отлаживать, то это не очень полезно. Вы можете просто отключить его только для этого файла.

gcc -fno-var-tracking ...

Должен сделать свое дело. Как я уже сказал, я думаю, вы можете просто сделать это для этого файла.

В GNU Make вы можете отключить отслеживание переменных для одной цели, если ваша команда компиляции использует переменную flags в аргументах, таких как

fileName.o: CXXFLAGS += -fno-var-tracking

Кроме ответов рассказываю как отключить-fvar-trackingна уровне CMake и на уровнеg++-на уровне командной строки, вы также можете отключить его для каждого файла, поместив эту строку вверху исходного файла:

      #pragma GCC optimize("no-var-tracking")

Затем, чтобы подавить ложное предупреждение, которое Clang выдает в этой строке, вы можете захотеть окружить его#pragma GCC diagnostic ignored, так:

      #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunknown-pragmas"
#pragma GCC optimize("no-var-tracking") // to speed up compilation
#pragma GCC diagnostic pop
Другие вопросы по тегам