【问题标题】:Should I use Groovy's @CompileStatic if I'm also using Java 7如果我也在使用 Java 7,我应该使用 Groovy 的 @CompileStatic
【发布时间】:2013-01-23 14:24:47
【问题描述】:

我已经阅读了"What's new in Groovy 2.0",但对于何时使用@CompileStatic 感到有些困惑。文章提到,@CompileStatic 注释是为无法利用 Java7 的调用动态部分的开发人员添加的。

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

我的问题是,如果我使用 JDK 7 并按照说明添加 --indy 标志,我是否需要添加 @CompileStatic 才能看到一些性能提升? This blog 建议我这样做,但我不确定他是否正确编译,因为他是在 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

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

【问题讨论】:

    标签: groovy java-7 invokedynamic groovy-2 compile-static


    【解决方案1】:

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

    斐波那契是顺便说一句不是一个调用动态可以发光的测试。印地港口并不总是更好。但是如果你经常使用元编程,那么 indy 会更好。

    最终还是要根据自己的使用情况来决定

    【讨论】:

    • 好答案。我从版本中的措辞中遗漏的部分是它们是独立的功能。因此,即使使用带有 -indy 的 Java 7,CompileStatic 也可以提高性能(只要编译器实际上可以对代码进行类型检查)。我们用 indy 和 CompileStatic 用 Fibonacci 快速测试了不同的排列,发现如下:
    【解决方案2】:

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

    所以,理论上:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2021-04-22
      • 2011-09-18
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      相关资源
      最近更新 更多