我是 Grails 的初学者,我想使用静态编译,但我不想GrailsCompileStatic
为每个类使用注释。我可以为配置文件中的所有类设置它吗?
GrailsCompileStatic
不能使用注解,因为我只需要为生产环境使用静态编译。对于其他环境应该使用动态编译。
请问有人知道解决办法吗??以及如何验证使用的编译?
谢谢解答。。
我是 Grails 的初学者,我想使用静态编译,但我不想GrailsCompileStatic
为每个类使用注释。我可以为配置文件中的所有类设置它吗?
GrailsCompileStatic
不能使用注解,因为我只需要为生产环境使用静态编译。对于其他环境应该使用动态编译。
请问有人知道解决办法吗??以及如何验证使用的编译?
谢谢解答。。
您不希望全局静态编译。似乎您不明白什么@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 和其他 3rd-party 库中。如果 Groovy 代码占了 20% 的时间(我怀疑它的平均值是否这么高),并且您能够使该代码的运行速度提高一倍,@CompileStatic
那么您将把这 20% 减少到 ~10%。是的,它更快,但不太可能明显更快,而且你会让你的工作变得不那么有趣,因为你会一直对你应该能够做但不能做的事情感到沮丧。
如果你愿意放弃那么多,也许 Grails 不是最好的选择。