tl;dr : 以下のコードが遅いのはなぜですか?
速度のために次のコードを最適化しようとしています。その目的は、n^2 操作を実行しながら、1 つの配列 (サイズ n=1000) を別の配列 (同じサイズ) に変換することです。変換の詳細は今のところ重要ではありません。
私は可能な限り速度を上げようとしているので、可能な限り Java プリミティブを使用しています。それでも、私が得たのは通常、1 回の「変換」呼び出しあたり約 70 ミリ秒です。Java に書き直すと、平均呼び出しにかかる時間は 2 ミリ秒未満です。
1) うわー、Java は速い
2) うわー、Clojure は遅い
3) どうしてそうなったのか説明してもらえますか? 単純に、Clojure が Java にかなり近いコード バイトコードを生成することを期待していますが、そうでないのはなぜでしょうか?
4) ^ints ヒントの使い方が 100% わからないのですが、間違っているのでしょうか?
(defn transform [^ints src]
(let [res ^ints (make-array Integer/TYPE 1000)]
(loop [x (int 0)]
(if (= 1000 x) res
(do
(aset res x (areduce src i ret (int 0)
(+ ret (* (mod x 2) (mod i 3) (aget src i)))))
(recur (inc x)))))))
(let [arr (into-array Integer/TYPE (range 1000))]
(doseq [_ (range 20)]
(println (time (transform arr)))
))