私は、繰り返しの短いストリングをたくさん格納して操作するシステムを実装しています。例えば株価系列。 (この中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つを選択しなければならない場合、メモリの最適化側ではなく、スピードの最適化側にあります。
いくつかの考えが頭に浮かぶ:1)私は、ブーストの実装に慣れていないんだけど、私はフライ級のように感じるちょうど私がNASDAQのティッカーシンボルのための完璧なハッシュを使用して作られたこの関連のデモを思い出し
UPDATEパターンは主にメモリ節約のためのものであり、速度のものではありません2)キャッシュのローカリティを忘れないでください。フライウェイトは、あなたが「ローカル」で作業している他のすべてのものと比べて、メモリの異なる部分にあることはほぼ確実です。これはキャッシュミスを意味します。 3)コンパイラが十分に新しい場合は、小さな文字列の最適化が必要です。短い文字列の場合は、スタックに文字列を割り当てます。それはフライウェイトよりも大きな違いを生むかもしれない。しかし、私は確信するためにいくつかのテストを実行する必要がありますと思います。 – 0x5453
私は@ 0x5453に同意します。この特定のケースでは、文字列をNUL終端のchar配列(例えば、 'std :: array')として格納する方がパフォーマンスに最適です。もちろん、それは割り当ての規模に依存します –
sehe
@ 0x5453あなたの返信に感謝します。私はこれが答えではなくコメントでなければならないと感じています。 :) – CodeNoob