Следует ли использовать Disruptor только для типов данных POD?
я имею в виду, следует ли Disruptor<T>
использовать только для T
значений, таких как byte[], int[], etc
?
, я сомневаюсь, что если мы используем T
, в котором в качестве его ссылки используется Object
переменные-члены, нам нужно new
те переменные-члены, которые будут лежать в куче.что снова приведет к пропаданию кэша, так как переменная-член может лежать на совершенно отдельной части кучи.
Так что я считаю правильным, что Disruptor<T>
следует использовать только для T
, принадлежащих множеству PlainСтарые типы данных (POD)?
С уважением, VImal
ОБНОВЛЕНИЕ: Может ли кто-нибудь еще взглянуть на этот вопрос?
ОБНОВЛЕНИЕ2:
Ответить на@ Триша
Привет Триша,
Привет.
Я видел ссылку, которую вы упомянули.
com.lmax.ticketing.api.Message
наследуется от javolution.io.Struct
и состоит изэлементы из javolution.io.Struct
и javolution.io.Union
, что делает взаимодействие Message
между C/C++
Для любого класса, наследуемого от javolution.io.Struct/Union
, структура памяти определяется порядком инициализации членов Struct/Union
и следует тем жеwordSize правил как C/C++
структуры.
Таким образом, по сути, вы можете контролировать расположение в памяти элементов, которые вы помещаете в Disruptor
.И все члены и подчиненные элементы Message
имеют фиксированный размер, то есть не имеют никакой динамической памяти (java.lang.Object
)
Это также моя точка зрения, что мы должны использовать такие элементы, чья структура памяти мы можемконтролировать и не иметь динамической памяти.И это сделано, чтобы минимизировать потери в кеше.
Предположим, если бы часть сообщения была, скажем, java.lang.String
, мы не знаем, где компилятор JIT разместил бы эту строку.и если я получаю доступ к Message.String
в an EventHandler
, это могло бы привести к пропаданию кэша, поскольку строка может присутствовать в совершенно другом фрагменте памяти ..
Я прав?