📝Clojure高速化

📝Clojure高速化

📂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 #

コンパイラに対して算術演算の方法を伝えるメタデータ.

References #