2013-06-25 11 views
5

私は、次があります。boost :: optional効率とは何ですか?

class Obj; 
typedef std::map<string, string> StrMap; 
std::map<std::string, std::pair<Obj, StrMap> > complexMap; 

ものですcomplexMapでいくつかのエントリのためにStrMapは空になり、効率のために、私は::ブーストを使用することを検討しているので、私は、まったく使用しないことオプション。私の質問は、boostの効率は何ですか::オプション、私はその価格を支払うことによって、私は最後に何も得られないだろうと思います。あなたは「スパース」の計算を行っている場合

+4

コードをプロファイリングして、作成によるパフォーマンスのボトルネックがあることを確認しましたか?空の地図? –

+1

@LucTouraille、いいえ、私は達成できる最高のパフォーマンスを望んでいます。 – Subway

+1

あなたはどのような選択肢を検討していますか? 「最高のパフォーマンス」を見つける方法は、さまざまなソリューションをプロファイルし、最高のパフォーマンスを持つソリューションを選択することです。 – juanchopanza

答えて

5

考える0または1の値を保持できるコンテナとして。あなたのマップはすでに0からNの要素を保持できるコンテナです。したがって、オプションのマップは、0〜N個の要素を保持できるコンテナ内のコンテナです。本当にここには利点はありません。

空のマップのオーバーヘッドは非常に小さいです。マップは実際にマップノードから内部的に構築され、空のマップはノードを持たないだけです。(各ノードが値を保持しているため、空のマップがデフォルト値を作成する方法がありません)

+0

シンプルでクリアです。ありがとう! – Subway

2

、あなたは2つのことを行うことができます。

  1. は含む大きなcomplexMapを保つboost::optionalと非既存の結果がたくさん。これは、要素に基づいてにスパースネスをカプセル化します。
  2. complexmMapの既存の要素へのポインタを含む間接参照の追加レイヤー(unordered_mapなど)を作成します。これは、マップに基づいて、にスパースネスをカプセル化します。

代わりの1は、スペースオーバヘッドを犠牲にしてもほとんど必要としないプログラマとしてあなたにとって便利です。代替2はほぼ完全にスペース効率が良く、complexMapはできるだけ小さくしておく必要がありますが、より多くのプログラミング作業が必要です。

complexMapでギガバイトレベルの計算を行っている場合は、インダイレクションの余分なレベルが報われるかもしれません。それ以外の場合は気にしません)。

スペースオーバーヘッドの他に、boost::optionalのコストはほとんどありません。デフォルトのコンストラクタやダイナミックメモリの割り当てが必要ないためです。答えにコメントを移動

2

...

は、オプションがどのように実装されるかを考えてみて、それは通常、(ホールドにマップオブジェクトを、それを可能にするために - あなたは上記のコードと同じように)いくつかの内部ストレージを持っています唯一の違いは、そのストレージ内にマップを構築しないことです。これは後で残しておきます。しかし、オプションのオブジェクトを構築する必要があります。したがって、マップを作成するのではなく、マップを使用していない場合にはより大きなオプションのオブジェクトを作成しています。マップを使用する場合は、そのマップも使用する必要があります。少しの利益のためにもっと多くのことをやっているようです。

optionalは意味がありません(たとえば戻り値、無効な状態を示す場合、複雑なメンバの初期化を行う非常に高価なコンストラクタがある場合など)。コンストラクタ、オプションは本当にコードの混乱の価値がありません。

免責

:しかし、すべてのパフォーマンス関連の質問のように、プロファイルは、プロファイルと、プロファイルを再び... optional

関連する問題