Disruptor は POD データ型にのみ使用する必要がありますか?
つまり、次のような値を取るDisruptor<T>ためだけに使用する必要があります。Tbyte[], int[], etc
私の疑いは、メンバー変数として参照Tを持つものを使用する場合、ヒープにあるそれらのメンバー変数が必要であるということです。メンバー変数がヒープの完全に別の部分にある可能性があるため、これもキャッシュミスにつながります。Objectnew
Plain Old Datatypes (POD) のセットに属するためDisruptor<T>だけに使用されるべきであるという私の考えは正しいですか?T
よろしく、 VImal
更新: 他の誰かがこの質問を見てもらえますか?
更新 2:
@トリシャに返信
こんにちはトリシャ、
ご挨拶。
あなたが言及したリンクを見ました。
com.lmax.ticketing.api.Messageから継承されjavolution.io.Struct、 から要素で構成され、javolution.io.Structとの間で相互運用可能になりjavolution.io.Unionます。メモリ レイアウト
から継承するクラスは、のメンバーの初期化順序によって定義され、構造体と同じ wordSize 規則に従います。MessageC/C++javolution.io.Struct/UnionStruct/UnionC/C++
したがって、本質的には、 に配置する要素のメモリ レイアウトを制御できますDisruptor。また、 のすべてのメンバーとサブメンバーMessageは固定サイズです。つまり、動的メモリはありません ( java.lang.Object)
それはまさに私のポイントでもあり、メモリレイアウトを制御でき、動的メモリを持たない要素を使用する必要があるということです。これは、キャッシュミスを最小限に抑えるために行われます。
たとえば、メッセージの一部が であった場合、java.lang.StringJIT コンパイラーがその文字列をどこに配置したかはわかりません。にアクセスしてMessage.StringいるEventHandler場合、文字列がメモリのまったく異なるチャンクに存在する可能性があるため、キャッシュミスが発生する可能性があります..
私は正しいですか?