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