この件に関するいくつかのブログ投稿を読んだ後、Clojure で配列を次のように変更することがわかりました。
(defn m [xs ys]
(dotimes [i (count xs)]
(aset #^ints ys (int i)
(int (* (int 3) (int (aget #^ints xs (int i))))))))
どこ(def xs (into-array Integer/TYPE (range 1000000)))
と(def ys (into-array Integer/TYPE (range 1000000)))
Criterium によると平均 14 ミリ秒かかりましたが、Java は同じことを行いました。
public static int[] m(int[] x, int[] y)
{
for(int i=0; i<x.length; i++)
y[i] = 3*x[i];
return y;
}
平均800usかかります。**
物事を迅速に進めるためにできる限りのことを行っていますか? また、最適化の道筋をたどることができますか?
** Criterium を(report-result (bench (m xs ys )) :verbose)
と で使用してこれらのタイミングを計りました(report-result (bench (. Test m xs ys)) :verbose)