如何优化Groovy代码?

时间:2017-11-28 13:29:47

标签: optimization groovy

互联网上有很多关于如何优化Java代码的指南,但对于Groovy来说并非如此。当一段Groovy代码需要运行得更快时,需要注意哪些特定于Groovy的东西?

1 个答案:

答案 0 :(得分:1)

初步:此答案特定于在Hotspot vm(OpenJDK,Oracle JVM)1.8版上运行的非indy Groovy代码。 indy选项有望改进动态调用,但我没有经验。

任何优化的标准免责声明:首先测量!代码中最慢的部分很可能是您没想到的。对于JVM代码我使用了honest profiler,它有其局限性但是对于CPU绑定的加载,它肯定比依赖于JVM检查点的分析器好得多。它是免费的。

优化Groovy代码:

  • @CompileStatic应用于所有热门代码!确保你不会错过某个中间的热门方法。如果没有CompileStatic,JVM的优化功能就没用了。
  • 避免使用Groovy收集方法。 Groovy集合方法(eachcollect等)很慢,因为它们使用JVM正确cannot be inlined的闭包。用Java样式for for for for循环替换循环。对于简单循环,这与Groovy语法一样可读。对于更复杂的情况,请查看本地Java集合方法或库,如Guava
  • 如果可以,请避免关闭。关闭调用很慢。即使您的所有代码都是@CompileStatic,闭包调用仍然使用Groovy的动态调度逻辑,这种逻辑很慢并且会阻止JVM优化。替代方法可以是具有单个方法的普通旧Java内部类。不幸的是,这很难看,Groovy不支持Java的匿名类语法。但请注意权衡。
  • 避免使用as关键字。 as进行了潜在的昂贵转换,这与转换不同。如果你想要的只是投射,而不是foo as Bar,而是写(Bar) foo。 Groovy演员阵容仍比Java中的演员阵容贵一点,但它们比转换便宜得多。 Groovy强制转换也比Java强制转换更多,例如在不同的数字类型之间进行转换。转换可能很有用,但只有在您真正想要转换而不仅仅是演员表时才使用它们,并且它们的成本在您的情况下是值得的。
  • 应用常规Java优化技术。它们通常在Groovy上和在Java上一样好。

你不需要打扰的东西:(这不是特定的Groovy,但仍然适用)

  • 让一切顺利。如果在实践中未更改局部变量或参数,JVM将看到并优化它,就像它是最终的一样。在某些情况下,最终的静态类成员仍然可以提供帮助,但编译器将跟踪例如类型也适用于最终和非最终字段。
  • 花费大量精力避免对象分配。对象分配非常便宜。第一代复制垃圾收集器仅复制活动对象并忽略死对象,因此短期对象几乎没有垃圾收集成本。通常,(当前)垃圾收集器在单独的线程上完成大部分繁重工作,因此除非所有处理器核心都已饱和,否则垃圾收集本身并不会明显减慢(单线程)代码的速度。重用对象可能会引入令人讨厌的错误并且通常很难看。如果分析表明您在垃圾收集上花费了大量时间,则只需要查看对象创建。