Groovy的性能与Java相比如何?

use*_*498 54 java groovy

Groovy与Java相比的性能如何?

jul*_*icz 50

Groovy编译为JVM显然是正确的.然而,这与性能无关.

这里要注意的最重要的事情是Groovy是一种动态语言.这实际上意味着大部分时间Groovy编译器几乎不知道它正在调用/从中检索属性的对象的类型.这对性能有很大影响.可能有数千个不同的类实现someFancyMethodName()没有公共基类.然而,对obj.someFancyMethodName()的调用必须选择正确的.没有比基于某种反射在运行时决定它更好的方法了.实际上,因为这样,对方法的每次调用都会通过对对象元类的invokeMethod()调用来调度.如果您的程序抛出一些令人讨厌的异常,这在堆栈跟踪中非常明显.情况更糟.groovy中的任何类都可以选择动态地提供给定名称的方法的实现,即在运行时生成它们.有相当数量的Grails魔法大量使用它.当方法重载发挥作用时,出现了另一个复杂问题.由于类型知识非常有限,因此无法在编译时选择正确的方法版本.生成的代码必须查看提供的对象,然后通过制作一系列if-elses选择最适合所提供调用的实现.这大部分时间都是一个非常重要的过程,从未打算在运行时执行.然而,Groovy必须这样做,以便与Java保持互操作.

所有这一切使得Groovy相当慢.事实上,比大多数动态语言(例如Python)更慢,更痛苦,更多的内存消耗.

也就是说,我同意使用Groovy的原因当然不是性能.大多数情况下,您最终只会优化代码的一小部分.如果性能是一个问题,你总是可以用纯Java重写那些特定的部分,或者尝试使用Groovy ++.我自己没试过,但是我在网上看到的结果似乎很有希望.

Groovy 2.0我没有运行新版本的经验.坦率地说,我不再是一个活跃的Groovy用户了.然而,我希望上述大多数问题基本上都很难,需要重大的科学突破.我有一些开发HHVM(由Facebook创建的PHP虚拟机)的经验,并且有许多简单的功能表现不佳.

  • 实际上Groovy 1.8非常快,几乎接近Java和Scala.这个答案现在已经过时了. (8认同)
  • @Wanderson不,不是.你有没有看过Groovy 1.8的更新日志?它确实在方法调度领域做了一些改进,但这主要涉及原始类型.现在这肯定会加快斐波那契基准,问题是,这绝不是一个典型的用例.到目前为止,没有任何动态语言可以在Java附近获得.我怀疑Groovy的所有增加的复杂性将比Python更快. (8认同)
  • 当然Groovy比Java慢,但你在第二和第三段中所说的大部分都是错误的或过时的.请记住,Groovy多年来已经取得了很大的进步. (4认同)
  • julkiewicz你在上面所说的内容中部分正确且部分错误.是的,Groovy对于原始类型来说只是那么快,而不是一般.那是真实的.虽然每个方法调用都必须经过某种调用方法,但事实并非如此.Groovy在运行时使用1.6以后生成的字节码存根用于呼叫站点缓存.这允许没有Reflection的方法调用.第一次通话仍然通常由Reflection完成,所以你当然可以在那里看到它. (3认同)

Wan*_*tos 18

所以我们在2012年,Groovy 2.0已准备好摇滚......

"使用@CompileStatic,Groovy的性能比Java快1-2倍,而且没有Groovy,它的速度要慢3-5倍.(...)这对我来说意味着Groovy已经准备好应用程序了与Java相当."

性能测试:Groovy 2.0与Java http://java.dzone.com/articles/groovy-20-performance-compared

除了autor之外,我自2008年以来一直使用Groovy取得了巨大的成功,不仅仅是为了简历,只是为了及时完成工作.性能与您想要的相关.


对于那些抱怨数字用例的人来说,这是一个使用Web框架的真实用例:http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/


"用于fib(42)的Groovy 1.8.x原型需要大约3.8s(比Java慢12%,比Groovy 1.0快100多倍)因此我们可能不再鼓励人们在Java中编写这样的"热点".

资料来源:http://www.wiki.jvmlangsummit.com/images/0/04/Theodorou-Faster-Groovy-1.8.pdf

"我对Groovy在数值计算方面的表现有多大提升印象深刻.我的项目jlab中的Groovy 1.8(http://code.google.com/p/jlabgroovy/)有时在我的其他项目ScalaLab中胜过Scala的表现(http: //code.google.com/p/scalalab)!!"

资料来源:http://groovy.329449.n5.nabble.com/Great-improvements-in-Groovy-s-performance-for-numerical-computing-td4334768.html

  • 我认为这个答案有误导性.在与纯数值计算相关的特定区域中,Groovy仍然慢12%.对于整体情况,我建议阅读@julkiewicz回答. (4认同)
  • @DavidVictor你在谈论动态语言与静态类型.只有12%?这很棒!你在谈论一个非常动态的MOP和AST语言!使用Groovy 1.8,它甚至更接近了.现在只需检查Groovy 2.0 ...... Groovy不仅仅是功能上的所有动态语言,而是更快的动态(真正动态)语言,不仅在JVM上,还有PHP,Phyton和其他动态语言.最好的祝福! (2认同)
  • 这丢失了什么 - 您对 @CompileStatic 的使用会导致如此多的限制和副作用,您最好不要称其为 Groovy。 (2认同)

Mel*_*elv 9

Groovy提供了比Java更多的语法糖,但仍然在JVM上运行,因此需要JVM提供更多的工作才能提供糖.然而,在绝大多数正常使用中,差异非常小.

另外,如果你碰巧编写了一个在Groovy中运行得太慢的函数,你可以用直接的Java编写它并从你的Groovy代码中调用它.这是该团队推荐的解决方案,我可以保证它运作良好而且简单.

我认为,对于我们大多数人所做的节目,这不是问题.


小智 8

快速谷歌搜索产生了一些旧的性能结果(http://www.codecommit.com/blog/java/groovys-performance-is-not-subjective,http://www.christianschenk.org/blog/performance-comparison-介于-groovy-and-java /)之间.

Groovy ++看起来也很有趣(http://stronglytypedblog.blogspot.com/2010/02/java-vs-scala-vs-groovy-vs-groovy.html).

然而,之所以使用Groovy应该是因为它提高你的表现没有电脑...