Java: Disruptor: следует ли использовать Disruptor только для типов данных POD?

Следует ли использовать Disruptor только для типов данных POD?

я имею в виду, следует ли использовать Disruptor<T> только для T, принимая такие значения, как byte[], int[], etc?

я сомневаюсь, что если мы используем T, который имеет Object ссылок в качестве переменных-членов, нам нужно new тех переменных-членов, которые будут лежать в куче. что снова приведет к промахам кеша, поскольку переменная-член может находиться в совершенно отдельной части кучи.

Итак, правильно ли я думаю, что Disruptor<T> следует использовать только для T, принадлежащих набору простых старых типов данных (POD)?

С уважением, Вимал.

ОБНОВЛЕНИЕ: Может ли кто-нибудь еще взглянуть на этот вопрос?

ОБНОВЛЕНИЕ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 в EventHandler, это могло привести к промаху кеша, поскольку строка может присутствовать в совершенно другом фрагменте памяти.

Я прав?


person weima    schedule 17.02.2012    source источник
comment
Я думаю, что ваш вопрос верен, хотя, возможно, сформулирован неправильно. Меня пока не убеждают ответы. Если размер вашего объекта события не фиксирован или не определен в «новое» время, я не вижу, как вы можете держать сборщик мусора в страхе.   -  person Benjol    schedule 19.03.2012


Ответы (2)


Вы можете использовать любой тип объекта в качестве события, например, см. код на странице https://github.com/mikeb01/ticketing (например, com.lmax.ticketing.web.RequestServlet) — использует Message в качестве объекта в RingBuffer.

RingBuffer предварительно заполняется этими событиями с помощью EventFactory, предоставленного при вызове конструктора Disruptor. Таким образом, вы создаете их новый экземпляр только при создании RingBuffer и повторно используете их на протяжении всего срока службы вашего Disruptor. Опять же, вы можете увидеть пример этого в приведенном выше проекте.

person Trisha    schedule 17.02.2012
comment
Привет, Триша, пожалуйста, см. мой ответ в вопросе выше. Спасибо. - person weima; 20.02.2012
comment
Но если размер вашего объекта не определен (например, содержит другие объекты, такие как строка), как система может «выделить» соответствующее пространство при инициализации? - person Benjol; 19.03.2012

Я бы сказал нет, потому что в коде, который вы написали, нет ограничений. Если автор имел в виду такое, код должен обеспечить его соблюдение.

ОБНОВЛЕНИЕ: У вас есть ответ: «нет». Если вы получите еще сотню ответов «нет», вам все равно придется ждать появления черного лебедя? Есть ли у вас какие-либо данные, указывающие на то, что это проблема?

Вы предполагаете, что все решения для кэширования постигнет та же участь? Я не знаю такого ограничения ни для одного из других решений для кэширования. Стоит ли рассматривать это дополнительное свидетельство?

person duffymo    schedule 17.02.2012
comment
да, код должен каким-то образом ограничивать это, а ограничений нет, но как насчет моих сомнений по поводу промахов кеша? в этом весь смысл использования Disruptor, чтобы свести к минимуму промахи кеша. - person weima; 17.02.2012
comment
Возможно, ваши сомнения беспочвенны. Возможно, разработчики учли такие вещи в своей реализации. - person duffymo; 17.02.2012
comment
Я надеюсь, что это так. Но я действительно ищу ответ. - person weima; 17.02.2012
comment
для меня нет, поскольку ответ в порядке. но я также хочу знать, почему это не имеет никакого влияния. - person weima; 17.02.2012
comment
... который будет лежать в куче. что снова приведет к промахам кеша, поскольку переменная-член может находиться в совершенно отдельной части кучи.... - это утверждение не имеет для меня смысла. Кто-то должен когда-нибудь позвонить новому. - person duffymo; 17.02.2012