我是Grails的初学者,我想使用静态编译,但我不想对每个类使用GrailsCompileStatic注释。我可以为配置文件中的所有类设置它吗?
不能使用GrailsCompileStatic注释,因为我只需要在生产环境中使用静态编译。对于其他环境,应该使用动态编译。
有人知道解决办法吗??以及如何验证所使用的编译?
谢谢你的回答..。
发布于 2014-10-31 11:32:42
您不需要全局静态编译。您似乎不了解@CompileStatic所做的事情,因为您希望它在dev中活动,而不是prod。它具有@TypeChecked的所有特性,因此编译器与Java编译器一样具有侵略性。这听起来不错,因为当使用传统的Groovy时,它将在编译时而不是在运行时捕获键入和其他错误。这确实发生了,但你也失去了很多功能。
除了使用严格的类型检查器外,@CompileStatic还禁用所有动态Groovy特性。这基本上是编译时所不知道的一切。它不影响诸如列表理解(def foo = [1, 2, 5])这样的语法功能,因为它本质上是创建新ArrayList并向其添加项的替代品,因此很明显,它是有效的。
您还会发现许多插件是不可用的,因为它们使用动态Groovy特性,并且代码不会在您的应用程序中编译。然而,这可能是一个积极的方面;您的团队将学到更多关于Grails的知识,因为他们将不得不重新发明这么多的轮子;)
但是,您将失去许多GORM方法,特别是动态查找器。许多GORM方法不是动态的,所以它们是通过AST转换添加的,但是User.findAllByAgeAndGender(...)是动态的,因为在启动时找出所有的组合太昂贵了。
因此,您必须非常小心哪些在dev模式下是安全的,哪些是不安全的,因为如果有人忘记并使用了一种动态方法,那么在某些用户在生产中碰到该代码路径之前,您将不会知道发生了什么。
在Groovy中,静态类型检查和编译是很好的特性,但是在Grails应用程序中100%地使用它们将大大降低性能的提高。如果您查看完成对服务器的web请求并返回到客户端所需的总时间,有很多因素。DNS查找和网络速度占用了大量的时间,对于大多数应用程序来说,大多数请求时间都用于等待数据库查询和更新的运行。Grails/Groovy代码用于工作的总时间将相当低,这只是服务器上非数据库时间的一部分。剩下的时间是用Grails代码编写的,它是用Java或Groovy (与@CompileStatic和dynamic混合编写的),以及Spring和其他第三方库编写的。如果Groovy代码占了20%的时间(我怀疑它平均如此之高),并且您可以使用@CompileStatic使该代码的运行速度提高一倍,那么您就可以将这20%降低到10%。是的,它是更快,但不太可能是明显的更快,你会使你的工作少得多的乐趣,因为你会不断地沮丧,你应该能够做,但不能。
如果你愿意放弃那么多,也许Grails不是最好的选择。
https://stackoverflow.com/questions/26671617
复制相似问题