Clojure で書いてたら1回ラスタを書き換えるのにすごく時間がかかってたから、ちょっとしらべてみた。
それぞれClojureとJava。 やってることは大して違いがなくて、BufferedImageのRasterにがーっとsetPixelで書き込むだけ。
Clojure | Java |
---|---|
1.590ms | 0.012ms |
100倍強!! Clojureってこんなに重いのか。
たしかにものすごく速くなりました(10倍以上)。
Javaを叩くときはリフレクションを無くすように書くことが大事なんですね。
ご教示いただきまして、ありがとうございます。
clojureがjavaより遅くなる一番の理由は、実行時のリフレクションが発生していることです。
まずは、「(set! warn-on-reflection true)」を使って
静的に型解決出来ない箇所に「型ヒント」を付けてやると良いです。
参考資料
http://clojure.org/java_interop
http://tnoda-clojure.tumblr.com/post/50280501176/type-hinting-and-primitive-hinting
リフレクションの警告が出てるところへ3箇所ほど型ヒントを付けてみました。
https://gist.github.com/odekopoon/7fda94171c583d14ca92/revisions
javaの方は試していませんが、初めよりは10倍ぐらいは速くなっていると思います。
最後に、useやrequireの前にwarn-on-reflectionを書くとライブラリ側の警告も出てくるので、
importの前にwarn-on-reflectionを移動しました。
(seesawは、reflectionが残ってますね・・・)