Disruptor 是否应该仅用于 POD 数据类型?
我的意思是应该Disruptor<T>
只用于T
取值,比如byte[], int[], etc
?
我的疑问是,如果我们使用T
which has Object
references 作为其成员变量,我们需要new
那些将位于堆上的成员变量。这将再次导致缓存未命中,因为成员变量可能位于堆的完全独立的部分。
那么我的想法是否正确,Disruptor<T>
应该只用于T
属于一组普通旧数据类型(POD)?
问候, 维马尔
更新:其他人可以看看这个问题吗?
更新2:
回复@Trisha
嗨特丽莎,
问候。
我看到了你提到的链接。
com.lmax.ticketing.api.Message
继承自javolution.io.Struct
元素并由元素组成,javolution.io.Struct
并且javolution.io.Union
它们Message
之间可以互操作C/C++
对于从内存布局继承的任何类,都由 's 成员javolution.io.Struct/Union
的初始化顺序定义,Struct/Union
并遵循与结构相同的 wordSize 规则C/C++
。
因此,从本质上讲,您可以控制放入Disruptor
. 并且所有成员和子成员Message
都是固定大小的,即没有任何动态内存(java.lang.Object
)
这也是我的观点,我们应该使用我们可以控制内存布局并且没有任何动态内存的元素。这样做是为了最大限度地减少缓存未命中。
假设,如果消息的一部分是,比如说,java.lang.String
我们不知道 JIT 编译器会将那个字符串放在哪里。如果我正在访问Message.String
anEventHandler
这可能会导致缓存未命中,因为字符串可能存在于完全不同的内存块中。
我对吗?