【问题标题】:How to set static compilation in Grails?如何在 Grails 中设置静态编译?
【发布时间】:2014-12-27 14:14:15
【问题描述】:

我是 Grails 的初学者,我想使用静态编译,但我不想为每个类使用 GrailsCompileStatic 注释。我可以为配置文件中的所有类设置它吗?

不能使用GrailsCompileStatic 注解,因为我需要为生产环境使用静态编译。对于其他环境应该使用动态编译。

请问有人知道解决办法吗??以及如何验证使用的编译?

感谢您的回答..

【问题讨论】:

  • 注意:CompileStatic 可能导致无法编译的代码。所以我不仅会用它来生产,而且总是(开发和测试)让构建尽早中断。

标签: grails environment static-compilation


【解决方案1】:

您不希望全局静态编译。似乎您不了解 @CompileStatic 的作用,因为您希望它在开发中处于活动状态而不是在生产中。它具有@TypeChecked 的所有功能,因此编译器与Java 编译器一样具有攻击性。这听起来不错,因为在使用传统 Groovy 时,它将在编译时而不是在运行时捕获拼写错误和其他错误。这确实会发生,但您也会失去很多功能。

除了使用严格的类型检查器之外,@CompileStatic 还禁用了所有动态 Groovy 功能​​。这基本上是在编译时无法知道正确的所有内容。它不会影响列表推导 (def foo = [1, 2, 5]) 等语法糖功能,因为它本质上是创建新 ArrayList 并向其中添加项目的替代品,因此很明显它是有效的。

您还会发现许多插件无法使用,因为它们使用动态 Groovy 功能​​,并且代码无法在您的应用程序中编译。然而,这可能是积极的;您的团队将比其他方式了解更多关于 Grails 的知识,因为他们将不得不重新发明这么多轮子;)

但是您会丢失很多 GORM 方法,尤其是动态查找器。许多 GORM 方法不是动态的,因此它们是通过 AST 转换添加的,但 User.findAllByAgeAndGender(...) 是动态的,因为在启动时找出所有组合的成本太高。

所以你必须非常小心在开发模式下什么是安全的,什么不是,因为如果有人忘记并使用动态方法,你不会知道这发生了,直到某些用户点击该代码路径生产。

静态类型检查和编译是 Groovy 中的重要功能,但在 Grails 应用程序中将它们用于 100% 的代码所带来的性能提升将大大低于我假设的预期。如果您查看完成对服务器的 Web 请求并返回客户端所需的总时间,则有很多因素。 DNS 查找和网络速度占用了大量时间,对于大多数应用程序来说,大部分请求时间都花在等待数据库查询和更新运行。 Grails/Groovy 代码花在工作上的总时间会相当少,而且它只是花在服务器上的非数据库时间的一部分。剩下的时间是在 Grails 代码中,这些代码是用 Java 或 Groovy(与 @CompileStatic 和动态混合)以及 Spring 和其他第 3 方库编写的。如果 Groovy 代码占了 20% 的时间(我怀疑它的平均值是否这么高),并且您可以使用 @CompileStatic 使该代码的运行速度提高一倍,那么您将把这 20% 减少到 ~10%。是的,它更快,但不太可能明显更快,而且你的工作会变得不那么有趣,因为你会一直对你应该能够做但不能做的事情感到沮丧。

如果你愿意放弃那么多,也许 Grails 不是最好的选择。

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多