uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovyのパフォーマンスについて

警告!: 本記事の内容は古いです。今はGroovyのチューニングが非常になされていて、さらに@CompileStaticアノテーションを指定することでJavaと同等の実行速度が得られます。


少し前に、「Groovyおせえぞごるぁ」な記事があって、それに対する「チューニングしてみたら早くなったよ」記事。

ポイントとしては:

  • ダックタイピングなところを明示的なタイピングにした(4分→3分)
  • each+クロージャによるループを一個除去(3分→1分50秒)
  • forループの終了条件の計算式が定数なのでループ外へ追い出す(8秒減)

結果的に、4分が1分半になったよ!でもJavaは4秒orzみたいな。
まあ、Java比60倍が20倍ちょいか。まだまだ遅いな。

【感想】

明示的なタイピング化って多少は効くんですねえ。以前見た記事では「むしろそれで遅くなる」とかあったので、逆に意外。
行ごとにどのぐらい時間がかかってるかもわかりますが、

  • 配列アクセスが遅い
  • ifの条件判断結構かかる

【提案】
インラインアセンブラみたいにJavaコードが書けるといいのかも。
inline(__java__) {
ここにJavaコードを書く
}
とかね。
JavaコードをGroovyで書くための「Java DSL」とか作ったりしてね。

【憶測コーナー】

私の見た感じでは、とにかく、Groovyはメソッドコールが遅い、それに尽きます。Expando MetaClassとかMOPでいろいろかぶせているのが遅さの根源。Javaオブジェクトを相互透過扱いさせる為に遅くなってる。その結果、Groovyはすべてがオブジェクトである、オペレータもメソッドコールである、とかの諸要因によって大打撃を受けている、という感じです。インラインJavaは悪くない考えだと思います。メソッドレベルでもいいから混在できないかのう。