Disruptor 是否应该仅用于 POD 数据类型?
我的意思是应该Disruptor<T>只用于T取值,比如byte[], int[], etc?
我的疑问是,如果我们使用Twhich has Objectreferences 作为其成员变量,我们需要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.StringanEventHandler这可能会导致缓存未命中,因为字符串可能存在于完全不同的内存块中。
我对吗?