互联网上有很多关于如何优化Java代码的指南,但对于Groovy来说并非如此。当一段Groovy代码需要运行得更快时,需要注意哪些特定于Groovy的东西?
答案 0 :(得分:1)
初步:此答案特定于在Hotspot vm(OpenJDK,Oracle JVM)1.8版上运行的非indy Groovy代码。 indy选项有望改进动态调用,但我没有经验。
任何优化的标准免责声明:首先测量!代码中最慢的部分很可能是您没想到的。对于JVM代码我使用了honest profiler,它有其局限性但是对于CPU绑定的加载,它肯定比依赖于JVM检查点的分析器好得多。它是免费的。
优化Groovy代码:
@CompileStatic
应用于所有热门代码!确保你不会错过某个中间的热门方法。如果没有CompileStatic,JVM的优化功能就没用了。each
,collect
等)很慢,因为它们使用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强制转换更多,例如在不同的数字类型之间进行转换。转换可能很有用,但只有在您真正想要转换而不仅仅是演员表时才使用它们,并且它们的成本在您的情况下是值得的。你不需要打扰的东西:(这不是特定的Groovy,但仍然适用)