📝Clojure高速化
Clojureの性能最適化や高速化についてのトピックまとめ.
main.coreでAOT(gen-class) #
Clojureは動的コンパイルのため, いわゆるJIT方式でJavaコンパイルをするが, AOT compilation をするには gen-class をつかう.
Clojure - Ahead-of-time Compilation and Class Generation
これをnamespaceの宣言でつかうことによってJavaのクラスを事前に生成するようになる. Java Classを生成することのメリットはいろいろあるようだが, たとえば xxxx.coreというプロジェクトのメインnamespaceに定義された -main関数をclojure cliから実行する場合, gen-classを宣言しておくことによってプログラム実行の起動が速くなる.
型ヒント(Type Hinting) #
Clojureは動的型付け言語だが動的型付け言語のJavaの上に構築されているため, 暗黙的な型はリフレクションによって型推論されている.
そのため型hintを設定することで型推論の効率化をすることができ, コンパイルや実行速度の最適化をすることができるかもしれない.
Clojureでは, ^ という記号を Record/Type/Protocol/Java Classに設定して 変数を宣言することで型ヒントを実現する.
ref: [Clojure] 型を指定すると速い | Basic Werk
Clojureは型ヒントを使ってコンパイラを助けることで, パフォーマンスの重要なコード領域に対してリフレクションを避けることができる.
ClojureはローカルコンテキストにおけるJavaの基本型を使った高速な計算や算術演算をサポートする. すべてのJava基本型(int, float, long, double, boolean, char, short, byte)がサポートされている。
プリミティブヒント(primitive hiting) #
プリミティブヒントは boxing を避けるためのもの.
(defn ->spread ^double [^double ask ^double bid]
(- ask bid))
無検査演算 #
Clojureは無検査演算が使える. unchecked-add. 型ヒントでも十分高速化できるが, unchecked-addをつかうともう少しだけ算術演算は高速化できる.
inline #
コンパイラに対して算術演算の方法を伝えるメタデータ.