2010-11-24 10 views
1

std :: mapとboost :: unordered_mapの違いについて多くの議論があります。しかし、boost :: interprocess :: mapはどうでしょうか?プロセス間マップとmap/unordered_map

誰かがboost :: interprocess :: mapとstd :: mapの間でパフォーマンステストを実行しましたか?

私はinterprocess :: mapをそれほど使用していませんが、1M要素を超えると、それは実際には遅くなると感じています。意味の比較ではありません

おかげ

答えて

3

ブーストプロセス間コンテナは、カスタムアロケータを持つ標準コンテナです。

理由:2つのプロセスがメモリを共有する場合、メモリは2つのプロセスの異なるアドレスにマップされます。共有メモリ・オブジェクトへのポインタを使用できるようにするには、絶対アドレスではなく相対オフセット(両方のプロセスで同一)を使用してください。

したがって、boost::interprocessに関連するアロケータクラスには逆参照時の余分な算術演算が含まれます。彼らは通常のポインタよりも少し重いカスタムのpointerを定義しています。

それ以外は、標準のコンテナとまったく同じです。同じ複雑さ、要素アクセス時のわずかなオーバーヘッド(余分な追加)。たとえば、mapunordered_mapの違いは、特別なプロセス間アロケータを使用しているときのように反映されます。

1

。それらはまったく異なる目的のために使用されます。

プロセス間でデータを共有するためにinterprocess :: mapが使用されます。 std :: mapは単一のプロセス内で使用されます。

// This file comes from SGI's stl_map/stl_multimap files. Modified by Ion Gaztanaga. 
// Renaming, isolating and porting to generic algorithms. Pointer typedef 
// set to allocator::pointer to allow placing it in shared memory. 

のでpreformanceの差がちょうどの種類に依存して使用アロケータのパフォーマンスの違いから来る:ファイルのブースト/プロセス間/コンテナ/コンテナ/ map.hppでこのコメントがあり

+1

私はinterprocess :: mapの目的を思い出させてくれてありがとう、本当に助かりました。それでも私はそれに反して、プロセス間マップを使用するときのパフォーマンスの低下を知ることは意味があります。 std :: map + file sharingとinterprocess :: mapのどちらかを選択する必要がある状況を想像することができます。この場合、これはパフォーマンスの違いを知ることに意味があります –

1

共有とオペレーティングシステムをサポートします。

+0

実際にはすべてのboost :: interprocessコンテナはカスタムアロケータを持つ通常のコンテナです。特に、これらのアロケータは、異なるプロセスが同じ共有メモリを異なるアドレスにマップするため、絶対アドレスではなくオフセットを格納するカスタムの 'ポインタ '型を定義します。 –

関連する問題