GroovyServ でつまづいた
連想配列のテストのために用意した Groovy のスクリプト。これを実は GroovyServ で動かして試そうとしたのだが、うまくいかなかった。
なので、そのレポート。
用意した Groovy のスクリプトはこれ。
5万行の乱数データ sample.txt を作成し
というようにして動作時間を測定する、はずだった。
が、実際に走らせて見ると、
まず見て分かるのは、1回目の実行で、重複データの件数が0件になっていること。実行時間も0.02secとなっており、一体何を標準入力から読み込んだの? といった感じ。
そして、二度三度と走らせると、正しい結果が出力されたり、例外が出て落ちてみたりと、とにかく安定しない。
また、普通に
とやると、0.4秒前後で済んでいた処理が、8秒近くと、かなり遅くなってしまっている。
これはTCP/IP通信のコストのせいなのだろうか?
とりあえず、このような問題が生じたので、その記録として、ここに書き込んでおく。
なので、そのレポート。
用意した Groovy のスクリプトはこれ。
long start=System.currentTimeMillis();
def buff=[:]
def cnt=0
System.in.eachLine() {
if (buff[it]) cnt++;
else buff[it]=1;
}
println cnt;
println ((System.currentTimeMillis()-start)/1000);
5万行の乱数データ sample.txt を作成し
C:\home>type sample.txt | groovyclient looptest.groovy
というようにして動作時間を測定する、はずだった。
が、実際に走らせて見ると、
C:\home>type sample.txt | groovyclient looptest.groovy
starting server...
..
0
0.02
C:\home>type sample.txt | groovyclient looptest.groovy
Caught: java.io.IOException: Write end dead
at org.jggug.kobo.groovyserv.StreamRequestInputStream.read(StreamRequestInputStream.groovy:40)
at looptest.run(looptest.groovy:4)
at org.jggug.kobo.groovyserv.GroovyInvokeHandler.invokeGroovy(GroovyInvokeHandler.groovy:80)
at org.jggug.kobo.groovyserv.GroovyInvokeHandler.this$2$invokeGroovy(GroovyInvokeHandler.groovy)
at org.jggug.kobo.groovyserv.GroovyInvokeHandler.run(GroovyInvokeHandler.groovy:47)
C:\home>type sample.txt | groovyclient looptest.groovy
18502
7.992
C:\home>type sample.txt | groovyclient looptest.groovy
18502
7.691
C:\home>type sample.txt | groovyclient looptest.groovy
Caught: java.io.IOException: Write end dead
at org.jggug.kobo.groovyserv.StreamRequestInputStream.read(StreamRequestInputStream.groovy:40)
at looptest.run(looptest.groovy:4)
at org.jggug.kobo.groovyserv.GroovyInvokeHandler.invokeGroovy(GroovyInvokeHandler.groovy:80)
at org.jggug.kobo.groovyserv.GroovyInvokeHandler.this$2$invokeGroovy(GroovyInvokeHandler.groovy)
at org.jggug.kobo.groovyserv.GroovyInvokeHandler.run(GroovyInvokeHandler.groovy:47)
C:\home>
まず見て分かるのは、1回目の実行で、重複データの件数が0件になっていること。実行時間も0.02secとなっており、一体何を標準入力から読み込んだの? といった感じ。
そして、二度三度と走らせると、正しい結果が出力されたり、例外が出て落ちてみたりと、とにかく安定しない。
また、普通に
C:\home>type sample.txt | groovy looptest.groovy
とやると、0.4秒前後で済んでいた処理が、8秒近くと、かなり遅くなってしまっている。
これはTCP/IP通信のコストのせいなのだろうか?
とりあえず、このような問題が生じたので、その記録として、ここに書き込んでおく。
この記事へのコメント
僕もよく同じ現象に遭遇します。
パイプなどが若干弱いような感じを受けました。
パイプはしてはいけないのかな。
ゲンゾウさんのところでも同じ状況ということですので、ここはひとつ、uehajさん、よろしくお願いします。