gpt4 book ai didi

disruptor-pattern - java : Disruptor: Should Disruptor be used only for POD datatypes?

转载 作者:行者123 更新时间:2023-12-04 08:36:51 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com