Должен ли я использовать 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, потому что некоторые накладные расходы и функции удалены.
Все это с оговоркой, что это будет во многом зависеть от того, что вы делаете, так как различные функции оптимизированы в разной степени.