Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save enshiromashiro/d7f3c8b69c34b8bb2f62 to your computer and use it in GitHub Desktop.
Save enshiromashiro/d7f3c8b69c34b8bb2f62 to your computer and use it in GitHub Desktop.
ClojureとJavaでRaster描画速度を比べてみた

ClojureとJavaで、しましまの描画速度を比べてみるのこと

Clojure で書いてたら1回ラスタを書き換えるのにすごく時間がかかってたから、ちょっとしらべてみた。

コード

それぞれClojureJava。 やってることは大して違いがなくて、BufferedImageのRasterにがーっとsetPixelで書き込むだけ。

結果

Clojure Java
1.590ms 0.012ms

100倍強!! Clojureってこんなに重いのか。

@odekopoon
Copy link

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が残ってますね・・・)

@enshiromashiro
Copy link
Author

たしかにものすごく速くなりました(10倍以上)。
Javaを叩くときはリフレクションを無くすように書くことが大事なんですね。

ご教示いただきまして、ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment