Должен ли я использовать Groovy @CompileStatic, если я также использую Java 7

Я прочитал "Что нового в Groovy 2.0" и немного смущен тем, когда использовать @CompileStatic. В статье упоминается, что аннотация @CompileStatic была добавлена ​​для разработчиков, которые не смогли воспользоваться динамической частью вызова Java7.

Таким образом, разработчики, стремящиеся к повышению производительности, не увидят больших изменений в Groovy 2.0, если они не смогут работать на JDK 7. К счастью, команда разработчиков Groovy подумала, что эти разработчики могут получить интересное повышение производительности, помимо других преимуществ, разрешив проверку типов. код, который компилируется статически.

Мой вопрос: если я использую JDK 7 и следую инструкциям по добавлению флага --indy, нужно ли мне добавлять @CompileStatic, чтобы увидеть некоторое увеличение производительности? Этот блог предполагает, что да, но Я не уверен, что он правильно скомпилировал, учитывая, что он сделал это в Eclipse.

Обновление: вот статистика при выполнении различных перестановок кода Фибоначчи.

> groovy --indy FibBoth.groovy
..........Fib (non-static indy): 1994.465
..........Fib (static indy): 529.197

> groovy FibBoth.groovy       
..........Fib (non-static): 1212.788
..........Fib (static): 525.671

Примечание. Теперь этот вопрос кажется немного запутанным, когда я понимаю, что функции независимы. Поскольку в основе вопроса лежит путаница из заметок, которая заставила меня думать, что эти две функции связаны, я думаю, что имеет смысл не менять формулировку вопроса и разрешить принятый ответ, объясняющий различия.


person Scott    schedule 07.02.2013    source источник


Ответы (2)


Инди-версия полностью динамическая Groovy, как известно, только быстрее благодаря JDK 7 invokedynamic. @CompileStatic означает статическую компиляцию. Хотя он быстрее обычного Groovy, он может компилировать только часть Groovy и ведет себя немного иначе. Особенно все динамические функции больше не доступны. Так что, если вы хотите использовать динамические функции, то Indy — единственный вариант. Если вы будете статичным парнем и будете использовать только небольшую часть языка, то можно использовать @CompileStatic.

Фибоначчи, между прочим, не является тестом, в котором может проявить себя invokedynamic. Инди-порт не всегда лучше. Но если вы например много занимаетесь метапрограммированием, то инди будет лучше.

Вы должны решить в соответствии с вашим использованием в конце

person blackdrag    schedule 19.02.2013
comment
Хороший ответ. Часть, которую я упустил из формулировки в выпуске, заключается в том, что они являются независимыми функциями. Таким образом, даже при использовании Java 7 с -indy CompileStatic может повысить производительность (при условии, что компилятор действительно может проверить тип кода). Мы быстро протестировали различные перестановки с помощью indy и CompileStatic с Fibonacci и обнаружили следующее: - person Scott; 23.02.2013

Короче говоря, @CompileStatic удаляет некоторые динамические функции среды выполнения Groovy в пользу скорости.

Итак, теоретически:

  • JDK7 должен быть быстрее, чем JDK6, из-за функции invokedynamic.
  • @CompileStatic должен быть быстрее, чем Standard, потому что удалены некоторые накладные расходы и функции.

Все это с оговоркой, что это будет во многом зависеть от того, что вы делаете, поскольку различные функции оптимизированы в разной степени.

person Daniel Bower    schedule 21.02.2013