- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Disruptor 是否应该仅用于 POD 数据类型?
我的意思是应该Disruptor<T>
仅用于 T
取值如 byte[], int[], etc
?
我的疑问是,如果我们使用 T
其中有 Object
引用作为其成员变量,我们需要 new
那些将位于堆上的成员变量。
这将再次导致缓存未命中,因为成员变量可能位于堆的完全独立的部分。
我的想法是正确的Disruptor<T>
应该只用于 T
属于普通旧数据类型(POD)的集合?
问候,
维马尔
更新:其他人可以看看这个问题吗?
更新2:
回复@Trisha
嗨特丽莎,
问候。
我看到了你提到的链接。com.lmax.ticketing.api.Message
继承自 javolution.io.Struct
并由 javolution.io.Struct
中的元素组成和 javolution.io.Union
这使得 Message
可以在 C/C++
之间进行互操作
对于任何继承自 javolution.io.Struct/Union
的类内存布局由 Struct/Union
的初始化顺序定义。的成员并遵循与 C/C++
相同的 wordSize 规则结构。
因此,本质上,您可以控制放入 Disruptor
中的元素的内存布局。 .以及 Message
的所有成员和子成员是固定大小的,即没有任何动态内存(java.lang.Object
)
这也正是我的观点,我们应该使用我们可以控制内存布局并且没有任何动态内存的元素。这样做是为了最大限度地减少缓存未命中。
假设,如果消息的一部分是,比如说,java.lang.String
,我们不知道 JIT 编译器会将那个字符串放在哪里。如果我正在访问 Message.String
在一个 EventHandler
这可能导致缓存未命中,因为字符串可能存在于完全不同的内存块中。
我对吗?
最佳答案
您可以使用任何类型的对象作为事件,例如,参见 https://github.com/mikeb01/ticketing 处的代码(例如 com.lmax.ticketing.web.RequestServlet) - 这使用 Message
作为 RingBuffer
中的对象.RingBuffer
使用 EventFactory
预先填充了这些事件当您调用 Disruptor
时提供构造函数。因此,您只需在创建 RingBuffer
时创建它们的新实例,并且您可以在 Disruptor
的整个生命周期中重复使用它们.同样,您可以在上述项目中看到一个示例。
关于disruptor-pattern - java : Disruptor: Should Disruptor be used only for POD datatypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327825/
我是一名优秀的程序员,十分优秀!