我对Groovy来说是全新的,如果我错过了一些明显的东西,请提前道歉。
我试图在Groovy中做一些简单的REST API脚本,但首先想要理解它对于请求/ JSON解析与Python的性能。我写了下面的脚本 - 我看到导入需要大约7秒。有没有办法包括'脚本中的那些,所以每次运行都不需要这么长时间?
def now = new Date()
println now.format("yyyyMMdd-HH:mm:ss.SSS", TimeZone.getTimeZone('UTC'))
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.7')
@Grab('oauth.signpost:signpost-core:1.2.1.2')
@Grab('oauth.signpost:signpost-commonshttp4:1.2.1.2')
import groovyx.net.http.RESTClient
import static groovyx.net.http.ContentType.*
for (i = 0; i <1; i++) {
def Client = new RESTClient("http://www.mocky.io/v2/59821b4a110000a9103964eb" )
def resp = Client.get(contentType: JSON)
def myResponseObject = resp.getData()
println myResponseObject.items[i].id
}
now = new Date()
println now.format("yyyyMMdd-HH:mm:ss.SSS", TimeZone.getTimeZone('UTC'))
我得到了这个输出:
~$ time groovy Requests.groovy
20170802-18:36:24.556
10
20170802-18:36:25.290
real 0m7.173s
user 0m4.986s
sys 0m0.329s
Grabs和导入的前几行占据了运行时间的大部分时间,这就是我想要削减的内容。
答案 0 :(得分:3)
这不是需要时间的导入,而是来自Grape的@Grab
注释 - 一个Groovy依赖管理系统。这3行:
@Grab('org.codehaus.groovy.modules.http-builder:http-builder:0.7')
@Grab('oauth.signpost:signpost-core:1.2.1.2')
@Grab('oauth.signpost:signpost-commonshttp4:1.2.1.2')
定义脚本依赖项。这些依赖项是作为JAR文件提供的第三方库。其中一些甚至可能有自己的依赖项,也会下载以满足您定义的依赖项(例如http-builder
需要Apache的HTTP客户端和核心库。)
运行此脚本需要一些时间(在我的笔记本电脑上大约1秒),因为Groovy必须确定所有依赖项并将它们添加到类路径以满足所有导入。请记住,您的脚本使用了比3更多的依赖项,并且所有这些依赖项都必须得到解决。
使用Grape实际上是以最简单的方式使用第三方库和委派给Groovy的一些开销之间的折衷。或者,您可以使用以下命令运行脚本:
groovy -classpath ${GROOVY_CLASSPATH} Request.groovy
其中${GROOVY_CLASSPATH}
包含成功运行脚本所需的所有JAR文件的路径。相信我 - 你必须添加至少15个库而不是那3个葡萄。然后,您将能够删除所有@Grab
注释(在这种情况下不需要它们,因为您将通过提供类路径中的所有库来满足groovy脚本)并且您的脚本将在眨眼之间执行 - 将会通过解析和加载所有依赖项不会产生任何开销。
另一个替代解决方案是使用Gradle来管理所有依赖项并创建所谓的“fat JAR”,其中包含所有必需的依赖项 - 在这种情况下,您将能够使用java
命令和所有导入来运行程序将没有任何依赖解决机制。
最后的结论。 Grape是一个强大的Groovy功能,它有自己的局限性。它允许你处理依赖 - 很容易,但它有自己的成本。我希望这个答案能帮助你做出一个好的选择。