Подтвердить что ты не робот

Должен ли я использовать 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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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