【问题标题】:When/why would I want to use Groovy's @CompileStatic?何时/为什么要使用 Groovy 的 @CompileStatic?
【发布时间】:2015-04-13 15:24:10
【问题描述】:

我读过这个:http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html,和这个:Should I use Groovy's @CompileStatic if I'm also using Java 7,并且知道肯定会有性能改进,但就是这样吗?我不明白 @CompileStatic 到底做了什么。

在某些类上添加@CompileStatic 是一件轻而易举的事吗?我哪里不想要它?

【问题讨论】:

  • 你想要更快/类型检查的类,并且不需要动态特性?

标签: groovy annotations


【解决方案1】:

引用我对Should I use Groovy's @CompileStatic if I'm also using Java 7的部分回答:

虽然比普通的 Groovy 更快,但它只能编译 Groovy 的一个子集,并且行为有点不同。尤其是所有动态功能都不再可用。

所有 MOP 都将被绕过。构建器通常无法工作,有些对编译器进行了扩展以允许它们通过。此外,在编译时使用静态类型选择方法,而 Groovy 通常使用运行时可用的方法和运行时类型。这可能会导致调用不同的方法。

当然,@CompileStatic 也提供了一些安全性,因为编译器的任务是在运行时验证程序。但是由于静态信息注定是不完整的,所以永远不可能有 100% 的安全性。

那么它在哪里是显而易见的......嗯......例如POGO,因为它们通常不包含那么多代码。当然,对于通过复制和粘贴从 Java 移植到 Groovy 的类。

我想要它在哪里?好吧,目前可能在 Android 上,因为代码大小会产生影响,并且静态编译的代码更紧凑。否则我个人完全可以不使用@CompileStatic。这更多的是品味问题。在某些情况下,紧密循环可以提高性能,但这需要您首先通过分析您的应用程序来进行识别

【讨论】:

  • 引用块来自哪里?从你说你引用的那个答案看起来不像。
  • 韦斯顿,你是对的,我错过了一个换行符,这使得引用看起来像继续。我更正了
  • 您能告诉我如何在其他类中使用@CompileStatic 注释调用其他类的闭包
  • @JahongirSabirov 为什么不举个例子?
【解决方案2】:

事实证明,@CompileStaticcan be useful 在 AOT 编译 groovy 程序时 - 例如使用 GraalVM native-image 工具。 native-image MethodHandle 支持仅限于 MethodHandle 对象是编译时间常数的情况。通过使用编译器配置,如:

import groovy.transform.CompileStatic
withConfig(configuration) {
    ast(CompileStatic)
}

可以消除生成字节码中的动态MethodHandle实例,让GraalVM提前编译成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2013-01-23
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多