0

次のルックアップテーブルを定義しています。

boost::unordered_map<std::string, STFRandomTreeFunctor*> functor_look_up_table;

ファンクターを呼び出すためにそれを使用するという考えですが、これは非常に遅く実行されているようです。最初は、ファンクターが呼び出す関数の実行に時間がかかる可能性があるためだと思いました。次のようにコードを置き換えました(つまり、への呼び出しを削除しましたfunctor())。

my_function(){
    while(...){
        STFRandomFunctor* f = functor_look_up_table.at(some_string);
        ...<do some other stuff>
    }
}

それでも実行速度は遅くなりますが、行を削除するSTFRandomFunctor* f = functor_look_up_table.at(some_string);とコードが大幅に高速化されます。ここのルックアップテーブルに間違った種類のデータ構造を使用していますか?もしそうなら、何が好ましいですか?

4

2 に答える 2

4

@aleguna 文字列は関数の ID です。例としては、"single_channel_subtract_abs"、"multi_channel_random_add"、"multi_channel_random_subtract_abs" があります。鍵は全部で5つ

unordered_map次に、文字列も:も使用しないでください。

// Function.hpp

enum FunctorName {
    single_channel_subtract_abs,
    multi_channel_random_add,
    multi_channel_random_substract_abs,
    ...
};

STFRandomTreeFunctor const& get(FunctorName name);

// Function.cpp
static STFRandomTreeFunctor const Functors[] = {
    ...
};

STFRandomTreeFunctor const& get(FunctorName name) {
    size_t const index = name;

    assert(index < sizeof(Functors) && "Need to update Functors");

    return Functors[index];
} // get

が完全なファンクターではなく関数型の場合は、const&get完全に削除できます。STFRandomTreeFunctortypedef

于 2012-10-31T17:12:14.990 に答える
0

unordered_mapルックアップは非常に高速ですが、優れたハッシュ関数があれば、マップを見るたびにキーのハッシュが計算されるため、ハッシュの計算に時間がかかると、パフォーマンスが低下します。hash関数が同様の値を生成する場合hash、すべての(または多くの)アイテムが1つのバケットに分類され、検索が線形になる可能性があります。最初の部分では、文字列が非常に大きくなり、デフォルトのハッシュにboost時間がかかりますが、2番目の部分では試してください。バケットサイズを変更し、パフォーマンスを再度確認します。

于 2012-10-31T16:53:25.627 に答える