2017-08-02 150 views
0

我對Groovy完全陌生,所以如果我錯過了某些明顯的東西,請提前道歉。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 

恰在第一次收藏的幾行和進口正在服用的大部分運行時,這就是想什麼我給砍掉了。

+0

可能的重複https://stackoverflow.com/questions/254385/how-do-i-auto-load-a-database-jar-in-groovy-without-using-the-cp-switch – bdkosher

+0

@bdkosher - 不是我正在尋找的東西 - 這可能在本地工作,但它不會在另一臺機器上工作。 – cdm

+0

您是否無法更改命令參數或將jar添加到其他機器上的.gradle/lib? – bdkosher

回答

3

這不是導入需要時間,而是@Grab註釋來自Grape - 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腳本,並在類路徑中提供所有庫),並且您的腳本將在眨眼間執行 - 不會造成任何開銷通過解析和加載所有的依賴關係。

另一種替代解決方案是使用搖籃來管理所有的依賴關係,並創建所謂的「胖JAR」這裏麪包含所有的強制依賴 - 在這種情況下,你將能夠與java命令運行您的程序和所有的進口將在沒有任何依賴關係解析機制。

最終結論。 Grape是一個強大的Groovy功能,它有其自身的侷限性。它允許你處理依賴關係 - 地獄很容易,但它有自己的成本。我希望這個答案能幫助你做出一個不錯的選擇。

+0

非常詳細的解釋感謝 - 答案接受。 – cdm

+0

@cdm謝謝,我很高興我能幫助你。 –