Groovy相对于Java的性能表现如何?
Groovy相对于Java的性能表现如何?
很明显,Groovy是编译到JVM的。但这与性能关系不大。
最重要的是,Groovy是一种动态语言。这意味着大多数时候,Groovy编译器对于调用方法或检索属性的对象类型几乎没有认知。这对性能有一个巨大的影响。可能会有成千上万个实现someFancyMethodName()的不同类,它们没有共同的基类。然而,调用obj.someFancyMethodName()必须选择正确的方法。这没有比在运行时基于某种反射来决定更好的方法了。事实上,因为这个原因,每次对方法的调用都会通过调用对象元类上的invokeMethod()进行分派。如果您的程序抛出一些恶心的异常,则在堆栈跟踪中非常明显。甚至更糟糕的是,Groovy中的任何类都可以选择在运行时提供给定名称的方法实现,即在运行时生成它们。 Grails魔法使用了相当数量的这种功能,这会使问题变得更加复杂。当方法重载进入时,另一个问题就出现了。由于类型知识非常有限,因此无法在编译时选择正确版本的方法。生成的代码必须查看提供的对象,并通过制作一系列if-else语句来选择最适合提供的调用的实现。大多数情况下,这是一个非常不平凡的过程,从未被设计为在运行时执行。然而,Groovy必须这样做,以保持与Java的互操作性。
所有这些都使Groovy变得相当缓慢。事实上,比大多数动态语言(例如Python)更慢,而且更占用内存。
也就是说,我同意使用Groovy的原因肯定不是性能。大多数情况下,您将只优化一小部分代码。如果性能是问题,您可以随时将这些特定部分重写为纯粹的Java,或者尝试Groovy ++。虽然我自己没有尝试过,但我在网上阅读到的结果似乎非常有前途。
Groovy 2.0 我没有运行过更新版本的经验。坦率地说,我不再是一个活跃的 Groovy 用户。然而,我预计上述大多数问题基本上都很难解决,并需要重大的科学突破。我有一些开发 HHVM(Facebook 创建的 PHP 虚拟机)的经验,其中有许多更简单的功能表现不佳。
现在是2012年,Groovy 2.0准备就绪...
"使用@CompileStatic,Groovy的性能比Java慢1-2倍,没有Groovy,则慢3-5倍。(...)这对我来说意味着Groovy可以用于需要与Java性能相当的应用程序."
性能测试:Groovy 2.0 vs. Java http://java.dzone.com/articles/groovy-20-performance-compared
除了作者之外,我自2008年以来一直成功地使用Groovy,不仅为简历,而是为了按时完成工作需求。性能始终取决于您想要做什么。
对于那些抱怨数字使用情况的人,这里有一个真实的使用案例,使用 web 框架: http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/
"Groovy 1.8.x针对fib(42)的原型大约需要3.8秒(只比Java慢12%,比Groovy 1.0快100倍以上),所以我们不再鼓励人们在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/)中,有时可以胜过我的其他项目ScalaLab (http://code.google.com/p/scalalab) 的性能 !!"
Groovy在数值计算方面的性能得到了很大改善。对于那些需要进行科学计算或数据分析工作的开发人员,这是一个重要的进步。由于Groovy脚本使用Java底层库,因此它们可以与Java代码互操作,从而使Groovy成为一种很好的补充语言。
Groovy提供了比Java更多的语法糖,但仍在JVM上运行,因此需要JVM进行一些额外的工作来提供这些语法糖。尽管如此,在绝大部分正常用途中,差异非常小。
此外,如果您恰好编写了一个在Groovy中运行太慢的函数,可以将其用Java编写并从您的Groovy代码中调用。这是团队推荐的解决方案,我可以证明其工作得很好而且很简单。
在我看来,对于我们大多数人所做的编程工作来说,这不是问题。
快速的谷歌搜索可以得到一些旧的性能结果 (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 的原因应该是因为它能提高你的性能,而不是计算机的性能...
我认为,您需要查看这篇关于Groovy、Python、PHP和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
这是一个很好的快速学习,可以帮助你确定哪种语言更好。
一般来说,Groovy会比较慢。而使用Groovy++可以避免这个问题,它提供了大部分Groovy的功能,但是可以静态编译,并且性能与Java相当。
在开发AWS Lambdas时,Java比Groovy更快。除此之外,在所有其他情况下,您可能感受不到太大的差异。
Groovy被编译成字节码.class文件,但运行Groovy类需要约5MB的Groovy库,这会导致性能开销。