В каких ситуациях мы можем ожидать прироста производительности с Groovy 2.0 + динамический вызов?

Я перенес Java-код теста Havlak от Роберта Хундта (см. ссылка) на Groovy. Теперь я запускаю тест с Groovy 2.1.1 с динамическим вызовом и без него, но продолжительность вычислений почти одинакова. Что я сделал, чтобы включить динамический вызов? Я скопировал groovy--indy.jars из groovy-2.1.1\indy в groovy-2.1.1\lib. Затем я удалил в groovy-2.1.1\lib все groovy.jars без "indy" в их имени. После этого в IntelliJ IDEA я включил и отключил флаг «Файл»> «Настройки»> «Компилятор»> «Компилятор Groovy»> «Вызвать динамическую поддержку».

Я говорю это только для того, чтобы люди увидели, правильно ли я включил поддержку инди. Но это не мой вопрос. Мой вопрос в том, в каких ситуациях мы можем ожидать ускорения времени вычислений из-за динамического вызова. Я читал статьи об этом, но трудно перевести то, что там объясняется о том, что делает динамический вызов, в какое-то утверждение, что «этот вид кода будет выполняться быстрее с поддержкой indy». Бенчмарк Havlak выполняет большое количество циклов, когда значения изменяются посредством вызова сеттеров.

Я был бы рад, если бы кто-нибудь, разбирающийся в этом вопросе, скинул бы здесь некоторые пояснения :-).

Спасибо, Оливер.


person OlliP    schedule 24.02.2013    source источник


Ответы (2)


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

API-интерфейс invokedynamic создан для языков с диспетчеризацией динамических методов на JVM. Groovy, безусловно, является одним из них. Но он может использовать indy только в том случае, если вы используете метод с динамической отправкой. Я могу привести пример, если он вам нужен.

Однако я проанализировал функциональность инди-диспетчера в Groovy, и кажется, что он только упаковал старую функцию динамической диспетчеризации в свои дескрипторы методов. На самом деле, если это действительно так, то не может быть быстрее. По моему мнению, Groovy-реализация invokedynamic на данный момент не оптимизирована.

person Thorben    schedule 25.02.2013
comment
Groovy всегда выполняет динамическую диспетчеризацию, если только не выбран примитивный путь оптимизации, который выполняется только при определенных условиях, на которые можно повлиять во время выполнения. - person blackdrag; 07.03.2013
comment
Да, он всегда выполняет динамическую отправку. Я имею в виду, что invokedynamic может ускорить выполнение только в том случае, если вы используете метод несколько раз. Хорошо, это нормальный случай почти в каждой программе, но - person Thorben; 15.03.2013
comment
следует считать. Ускорение происходит, когда вызов был загружен и связан с скомпилированным дескриптором метода. Затем вы можете повторно использовать MethodHandle, пока что-то не изменится. Без indy и без методов кэширования в реализации языка сценариев и т. д. диспетчеризация происходила бы для каждого вызова метода. Возможно, это поможет. - person Thorben; 15.03.2013
comment
Поскольку я думаю, что Groovy 1.6 Groovy уже имеет реализацию кэширования сайта вызова. Он основан на классах, сгенерированных во время выполнения, и некотором отражении. Так что случай повторного использования уже был возможен раньше. - person blackdrag; 20.03.2013

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

более длинный ответ: если бы вы могли опубликовать код где-нибудь, я мог бы его проанализировать

person blackdrag    schedule 07.03.2013