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は悪くない考えだと思います。メソッドレベルでもいいから混在できないかのう。