2016-10-27 10 views
1

私は、繰り返しの短いストリングをたくさん格納して操作するシステムを実装しています。例えば株価系列。 (この中MSFTよう短いストリングのブーストフライウェイト

<time1>,MSFT,60.01 
<time2>,MSFT,60.02 
<time3>,MSFT,60.00 

私はメモリ割り当て、文字列の検索/比較/それらの小さな繰り返しのティッカー名のコピーコストを最適化するためにBoost::Flyweightを使用して考えています:私は、Microsoftの株価の繰り返しエントリの多くを持つことになります場合)。

しかし、これらの文字列はかなり小さく、通常はわずか数バイトです。最近のコンピュータでは、ロングタイプはすでに8バイトです。この場合、Boost::Flyweightを使用する価値はありますか?

Boost::Flyweightの私の理解は、パフォーマンスを向上させるために内部化された文字列が整数であることです。しかし、私は、8バイトの文字列を検索/比較/コピーすることは、8バイトの長いデータ型を扱うこととは劇的に異なるとは思えません。それでBoost::Flyweightに移動するのは大変価値がありますか?

私の主な目標は、私が1つを選択しなければならない場合、メモリの最適化側ではなく、スピードの最適化側にあります。

+0

いくつかの考えが頭に浮かぶ:1)私は、ブーストの実装に慣れていないんだけど、私はフライ級のように感じるちょうど私がNASDAQのティッカーシンボルのための完璧なハッシュを使用して作られたこの関連のデモを思い出し

UPDATEパターンは主にメモリ節約のためのものであり、速度のものではありません2)キャッシュのローカリティを忘れないでください。フライウェイトは、あなたが「ローカル」で作業している他のすべてのものと比べて、メモリの異なる部分にあることはほぼ確実です。これはキャッシュミスを意味します。 3)コンパイラが十分に新しい場合は、小さな文字列の最適化が必要です。短い文字列の場合は、スタックに文字列を割り当てます。それはフライウェイトよりも大きな違いを生むかもしれない。しかし、私は確信するためにいくつかのテストを実行する必要がありますと思います。 – 0x5453

+0

私は@ 0x5453に同意します。この特定のケースでは、文字列をNUL終端のchar配列(例えば、 'std :: array ')として格納する方がパフォーマンスに最適です。もちろん、それは割り当ての規模に依存します – sehe

+0

@ 0x5453あなたの返信に感謝します。私はこれが答えではなくコメントでなければならないと感じています。 :) – CodeNoob

答えて

0

フライウェイトは非常に一般的で構成可能です。

固定サイズの単一のプール(たとえばstd::vector<CharType>)から割り当てられた文字列を使用することをおすすめします。バッキングストレージ内のバイトの範囲にstd::string_view秒を返すだけです。

FlyWeightを使用してそのような設定を行うことはできますが、デモするには時間が必要です。

また、自分でロールすることもできます。フライ級での私の経験は(https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight、例えばboost multi_index_container and slow operator++)を変化させた

:私はStackOverflowの上のいくつかのサンプルを持っています。 Flyweightの純粋な実装はめったにあなたが望むものではないようです。 Is it possible to map string to int faster than using hashmap?

+0

完全なハッシュアプ​​ローチを追加しました。 (¹脚注にも注意してください) – sehe