14

我已经阅读了“Groovy 2.0 中的新增功能”,但对于何时使用 @CompileStatic 感到有些困惑。文章提到,@CompileStatic注释是为无法利用 Java7 的调用动态部分的开发人员添加的。

因此,如果无法在 JDK 7 上运行,寻求性能改进的开发人员不会在 Groovy 2.0 中看到太多变化。幸运的是,Groovy 开发团队认为这些开发人员可以通过允许类型检查获得有趣的性能提升以及其他优势静态编译的代码。

我的问题是,如果我使用的是 JDK 7 并按照说明添加--indy标志,是否需要添加@CompileStatic才能看到一些性能提升? 这个博客建议我这样做,但我不确定他是否正确编译,因为他是在 Eclipse 中完成的。

更新:以下是运行斐波那契代码的不同排列时的统计数据。

> groovy --indy FibBoth.groovy
..........Fib (non-static indy): 1994.465
..........Fib (static indy): 529.197

> groovy FibBoth.groovy       
..........Fib (non-static): 1212.788
..........Fib (static): 525.671

注意:这个问题现在似乎有点令人困惑,因为我知道这些功能是独立的。由于问题的基础是围绕使我认为这两个功能相关的注释中的混淆,我认为不更改问题措辞并允许解释差异的公认答案是有意义的。

4

2 回答 2

13

众所周知,indy 版本是完全动态的 Groovy,由于 JDK 7 的 invokedynamic,速度更快。@CompileStatic 表示静态编译​​。虽然比普通的 Groovy 更快,但它只能编译 Groovy 的一个子集,并且行为有点不同。尤其是所有动态功能都不再可用。因此,如果您想使用动态功能,那么 indy 是唯一的选择。如果你是一个静态的人并且只使用语言的一小部分,那么可以使用@CompileStatic。

顺便说一句,斐波那契不是一个可以让 invokedynamic 发光的测试。印地港口并不总是更好。但是如果你做很多元编程,那么 indy 会更好。

你最终要根据你的使用情况来决定

于 2013-02-19T14:08:13.500 回答
5

归根结底,@CompileStatic 删除了一些 Groovy 动态运行时功能以提高速度。

所以,理论上:

  • 由于invokedynamic,JDK7应该比JDK6快
  • @CompileStatic 应该比标准更快,因为删除了一些开销和功能。

需要注意的是,这在很大程度上取决于您在做什么,因为各种功能都在不同程度上进行了优化。

于 2013-02-21T07:47:06.780 回答