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

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам