tl;博士:为什么下面的代码这么慢?
我尝试优化以下代码以提高速度;它的目的是在进行 n^2 操作时将一个数组(大小 n=1000)转换为另一个(大小相同),转换的细节现在并不重要。
由于我试图获得尽可能快的速度,所以我尽可能地使用 Java 原语;尽管如此,我得到的通常是每个“转换”调用大约 70 毫秒。重写为 Java 时,平均调用时间小于 2 毫秒。
1) 哇,Java 真快
2) 哇,Clojure 很慢
3)你能向我解释一下,为什么会这样?天真地,我希望 Clojure 生成一个代码字节码,应该非常接近 Java 的,为什么不是这样?
4) 我不是 100% 确定如何使用这些 ^ints 提示,也许我弄错了?
(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)))
))