Какова производительность Groovy по сравнению с Java?
Как производительность Groovy по сравнению с Java?
Ответ 1
Очевидно, что Groovy компилируется в JVM. Это, однако, имеет мало общего с производительностью.
Самое главное здесь отметить, что Groovy - это динамический язык. Это по существу означает, что большую часть времени Groovy компилятор будет иметь мало знаний о типе объекта, который он вызывает метод при/извлечения свойства. Это оказывает огромное влияние на производительность. Существуют тысячи различных классов, реализующих someFancyMethodName(), не имеющих общего базового класса. Однако вызов obj.someFancyMethodName() должен выбрать правильный. Нет лучшего способа сделать это, чем решить его во время выполнения, основываясь на каком-то отражении. Фактически, из-за этого каждый вызов метода отправляется через вызов invokeMethod() на метаклассе объекта. Это очень заметно в stacktraces, если ваша программа когда-либо бросает некоторые неприятные исключения. Это еще хуже. Любой класс в Groovy может предлагать динамически реализовать реализации методов данного имени, которые производят их во время выполнения. Существует огромное количество магии Grails, которая сильно использует ее. Еще одно осложнение возникает при перегрузке метода. Поскольку знание типов настолько ограничено, невозможно выбрать правильную версию метода во время компиляции. Созданный код должен смотреть на поставленные объекты, а затем, создавая серию if-elses, выбирает реализацию, которая наилучшим образом соответствует предоставленному вызову. В большинстве случаев это действительно нетривиальный процесс, который никогда не должен выполняться во время выполнения. Тем не менее, Groovy должен это сделать, чтобы оставаться совместимым с Java.
Все, что делает Groovy довольно медленным. На самом деле намного медленнее и, что более болезненно, больше памяти, чем большинство динамических языков (например, Python).
Тем не менее, я согласен с тем, что причина использования Groovy, безусловно, не является производительностью. В большинстве случаев вы в конечном итоге оптимизируете только небольшую часть вашего кода. Если производительность является такой проблемой, вы всегда можете прибегнуть к переписанию этих конкретных частей в чистой Java или попробуйте Groovy ++. Я не пробовал это сам, однако результаты, которые я прочитал о онлайн, выглядели довольно многообещающе.
Groovy 2.0 У меня нет опыта работы с более новой версией. Честно говоря, я больше не являюсь активным пользователем Groovy. Тем не менее я ожидал бы, что большинство из описанных выше проблем в корне сложны и требуют серьезного научного прорыва. У меня есть опыт разработки HHVM (виртуальная машина PHP, созданная Facebook), и есть намного более простые функции, которые выполнялись плохо.
Ответ 2
Итак, вот мы в 2012 году, и Groovy 2.0 готов к рок-н-роллу...
"С @CompileStatic производительность Groovy примерно в 1-2 раза медленнее, чем Java, и без Groovy, она примерно в 3-5 раз медленнее. (...) Это означает, что Groovy готов для приложений, производительность которых должна быть несколько сопоставима с Java.
Тест производительности: Groovy 2.0 против Java http://java.dzone.com/articles/groovy-20-performance-compared
И кроме автора, я использовал Groovy с 2008 года с большим успехом, а не только для CV, просто для того, чтобы сделать работу в нужное время. Производительность всегда относительно того, что вы хотите сделать.
Для тех, кто жалуется на числовые варианты использования, здесь используется реальный прецедент с использованием веб-фреймворков: http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/
"Groovy 1.8.x прототип для fib (42) занимает около 3,8 с (всего на 12% медленнее, чем Java, в сто раз быстрее, чем Groovy 1.0). Таким образом, мы не можем более долго поощряют людей писать такие" горячие точки" на Java.
Источник: http://www.wiki.jvmlangsummit.com/images/0/04/Theodorou-Faster-Groovy-1.8.pdf
"Я впечатлен тем, насколько производительность Groovy улучшилась для численных вычислений. Groovy 1.8 в моем проекте jlab (http://code.google.com/p/jlabgroovy/) иногда превосходит производительность Scala в моем другом проекте ScalaLab (http://code.google.com/p/scalalab)!!"
Ответ 3
Groovy предлагает намного больше синтаксического сахара над Java, но все еще работает на JVM, и поэтому для JVM требуется немного больше работы для обеспечения этого сахара. Тем не менее, в подавляющем большинстве обычных обычаев разница крайне незначительна.
Кроме того, если вам посчастливилось написать функцию, которая работает слишком медленно в Groovy, вы можете записать ее в прямой Java и вызвать ее из вашего кода Groovy. То, что команда рекомендовала решение, и я могу поручиться за то, что она работает хорошо и просто.
Это мое мнение, для большинства программистов, это не проблема.
Ответ 4
Быстрый поиск Google дал некоторые старые результаты работы (http://www.codecommit.com/blog/java/groovys-performance-is-not-subjective, http://www.christianschenk.org/blog/performance-comparison-between-groovy-and-java/).
Groovy ++ также интересен (http://stronglytypedblog.blogspot.com/2010/02/java-vs-scala-vs-groovy-vs-groovy.html).
Однако причиной использования Groovy должно быть то, что оно улучшает вашу производительность, а не компьютеры...
Ответ 5
Вообще говоря, Groovy будет медленнее. Вы можете избежать этого, переключившись на Groovy ++, который предлагает большинство функций Groovy, но может быть статически скомпилирован и имеет производительность, сравнимую с Java.
Ответ 6
Я думаю, вы должны посмотреть на это научное сравнение Groovy Vs Python Vs PHP vs Ruby.
Они сделали одно упражнение и произвели сравнение на этих языках программирования на следующих факторах:
Comparison of time developing each exercise
Comparison of readability of the languages
Comparison of results in benchmarks and lines of code. From the project Computer Language Benchmarks Game
Conclusions
Это отличное быстрое исследование, позволяющее вам лучше понимать язык.
Ответ 7
Groovy скомпилирован в байт-код .class файлы, но для выполнения классов Groovy требуется ~ 5MB Groovy библиотека, которая делает издержки на производительность.