7

このような自動生成ファイルがあります...

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によると、-ftime-reportを使用すると、ビルド時間の約50%が「変数トラッキング」に費やされています。これはどういう意味ですか?スイッチから関数を引き出すという優れたキャッシュ局所性を維持しながら、コンパイルを高速化するにはどうすればよいですか?

編集:興味深いことに、プロジェクト全体の次のプロファイリング情報(問題のファイルだけでなく、優れたメトリックです。問題のファイルに最も時間がかかる)に従って、ビルド時間はデバッグビルドでのみ爆発しました。構築する):

  • デバッグ: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);
}
4

2 に答える 2

12

可変トラッキングをオフにすることができます。変数トラッキングは、デバッグ情報をもう少し価値のあるものにするために使用されますが、このコードが自動生成され、実際にはあまりデバッグしない場合は、あまり役に立ちません。そのファイルに対してのみオフにすることができます。

gcc -fno-var-tracking ...

トリックを行う必要があります。私が言ったように、私はあなたがそのファイルのためにそれをすることができると思います。

于 2010-06-02T02:19:50.803 に答える
2

GNU Makeでは、コンパイルコマンドが次のような引数でflags変数を使用する場合、単一のターゲットの変数追跡をオフにできます。

fileName.o: CXXFLAGS += -fno-var-tracking
于 2014-11-05T16:55:50.740 に答える