15

私は次のユースケースのどちらかを選択しようmapとしています。unordered_map

のキーはmapポインタです。最も一般的な使用例は、マップに単一の要素があることです。一般に、マップ内の要素の最大数は10未満です。マップは非常に頻繁にアクセスされ、速度が最も重要な要素です。マップへの変更はめったにありません。

ここでは速度の測定が明らかに正しいアプローチですが、このコードはいくつかのプラットフォームで使用されるため、要素の数に基づいてmapとを選択するための一般的な経験則を作成しようとしています。unordered_mapstd :: mapが少数の要素に対してより高速である可能性があることを示唆するいくつかの投稿をここで見ましたが、「小さい」の定義は与えられていません。

要素の数に基づいて、mapとの間でいつ選択するかについての経験則はありますか?unordered_map別のデータ構造(を介した線形検索などvector)はさらに優れていますか?

4

2 に答える 2

22

これらすべてが当てはまる場合、パフォーマンスの観点から何がより適切であるかを判断するために、常に測定する必要があるという前提の下で:

  1. マップへの変更は頻繁ではありません。
  2. マップには最大10個の要素が含まれています。
  3. ルックアップは頻繁に行われます。
  4. あなたはパフォーマンスを大いに気にします。

次に、要素をに配置し、std::vectorすべての要素に対して単純な反復を実行して、探している要素を見つける方がよいと思います。

Anstd::vectorはその要素をメモリの連続した領域に割り当てるため、キャッシュの局所性によってパフォーマンスが向上する可能性があります。キャッシュミス後にメインメモリからキャッシュラインをフェッチするのに必要な時間は、時間より少なくとも1桁長くなります。 CPUキャッシュにアクセスするために必要です。

非常に興味深いことに、Boostflat_mapはユースケースに理想的であるようです(Praetorian提供):

flat_mapに似てstd::mapいますが、順序付けられたベクトルのように実装されます。(オンラインドキュメントから

したがって、Boostの使用がオプションである場合は、これを試してみることをお勧めします。

于 2013-03-25T21:46:31.987 に答える
4

10要素以下の場合、通常は1つだけ、ソートされていないベクトルの線形検索が最適であると思います。ただし、使用するハッシュアルゴリズムによっては、代わりにunordered_mapの方が高速な場合があります。

ベンチマークを行うのは簡単なはずです。

于 2013-03-25T21:47:01.590 に答える