2017-08-02 6 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

時間がかかるインポートではなく、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秒)。スクリプトは3つ以上の依存関係を使用しており、すべてを解決する必要があることに注意してください。

グレープの使用は、実際にはサードパーティのライブラリを最も簡単な方法で使用することと、Groovyに委譲されるオーバーヘッドとの間の妥協です。またあなたとあなたのスクリプトを実行することができます:${GROOVY_CLASSPATH}はあなたが成功したスクリプトを実行するために必要なすべてのJARファイルへのパスが含まれてい

groovy -classpath ${GROOVY_CLASSPATH} Request.groovy 

。そして私を信じてください。あなたは少なくとも3つのブドウの代わりに少なくとも15の図書館を追加しなければなりません。次に、すべての@Grabアノテーションを削除することができます(この場合は必要ありません。クラスパス内にすべてのライブラリを提供することでgroovyスクリプトを満たします)。スクリプトは目の瞬きで実行されます。オーバーヘッドは発生しませんすべての依存関係を解決してロードする

また、Gradleを使用してすべての依存関係を管理し、内部にすべての必須依存関係を含むいわゆる "fat JAR"を作成することもできます。この場合、javaコマンドでプログラムを実行できます。依存関係の解決メカニズムなしに配置できます。

最終結論。 Grapeは強力なGroovyの機能であり、独自の制限があります。それはあなたが非常に簡単に依存関係を処理することができますが、それは独自のコストが付属しています。私はこの答えが良い選択をするのに役立つことを願っています。

+0

非常に徹底した説明をありがとう - 答えが受け入れられました。 – cdm

+0

@cdmありがとう、私はあなたを助けることができてうれしいです。 –

関連する問題