ConcurrentHashMap
をキャッシュとして使用する株式市場シミュレータを作成しました。高性能キャッシュの作成
キャッシュは約75個の要素を保持しますが、キャッシュは非常に高速に更新され(約500回/秒)更新されます。ここで
は私がやったことです:
スレッド1:
与えられた銘柄記号のためのストリーミング引用符で私を提供外部のシステムに接続されています。
スレッド2(コールバックスレッド):
待機データは、外部システムによってそこに配信されるまで。データを取得すると、それを解析し、不変のDataEntryオブジェクトを作成し、キャッシュし、thread3に信号を送信します。
スレッド3(消費者スレッド): 信号を受信すると、キャッシュからDataEntryを取り出して使用します。 (これは、スレッド2がスレッド3に直接データをプッシュしないようにするタスクの一部です)。
public final class DataEntry{
private final String field1;
private final String field2;
//...
private final String field25;
// Corresponding setters and getters
}
public final class Cache{
private final Map<String, DataEntry> cache;
public Cache(){
this.cache = new ConcurrentHashMap<String, DataEntry> (65, 0.75, 32);
}
// Methods to update and retrieve DataEntry from the cache.
}
プロファイラを通してそれを実行した後、私は私がたくさんDataEntry
オブジェクトのを作成していていることに気づきました。したがって、エデンは非常に迅速に満ちています。 A)がDataEntry
クラスが変更可能な作り
:
だから、私はしてデザインを少し微調整を考えています。
b)キャッシュを空のDataEntry
オブジェクトに事前に移入します。
c)更新が到着したら、DataEntry
オブジェクトをマップから取得し、フィールドに入力します。
このようにして、DataEntry
オブジェクトの数は一定で、要素数に等しくなります。
私の質問は以下のとおりです。
A)が、このデザインは、私がDataEntry
が可変することによって導入されている可能性のある並行性の問題を持っています。
b)キャッシュを最適化するために何かできることはありますか?
ありがとうございました。
ConcurrentHasMapには毎秒100万回以上アクセスでき、500にしかアクセスしていない場合はそれほど大きな影響はありません回/秒。 –
Mapに一度にアクセスするコア数が16以上になると予想される場合は、パーティションサイズを増やすだけです。一度に地図にアクセスする(そして他の何もしない)4コア未満を使用している場合は、それほど大きな違いはありません。 –
エデンをすぐにいっぱいにするのはなぜ問題なのですか?実際にEden GCに問題がありますか? – kdgregory