私の考えでは、Clojure ベクトルは Java 配列に比べてわずかにパフォーマンスが低下します。その結果、「従来の知恵」は、コードのパフォーマンスが重要な部分については、Java 配列を使用する方がよいと考えていました。
ただし、私のテストでは、これは正しくないことが示唆されています。
Clojure 1.3.0
user=> (def x (vec (range 100000)))
#'user/x
user=> (def xa (int-array x))
#'user/xa
user=> (time (loop [i 0 s 0] (if (< i 100000) (recur (inc i) (+ s (nth x i))) s)))
"Elapsed time: 16.551 msecs"
4999950000
user=> (time (loop [i 0 s 0] (if (< i 100000) (recur (inc i) (+ s (aget xa i))) s)))
"Elapsed time: 1271.804 msecs"
4999950000
ご覧のとおり、get はこの追加に約 800% の時間を追加します。ただし、どちらの方法もネイティブ Java よりもはるかに低速です。
public class Test {
public static void main (String[] args) {
int[] x = new int[100000];
for (int i=0;i<100000;i++) {
x[i]=i;
}
long s=0;
long end, start = System.nanoTime();
for (int i=0;i<100000;i++) {
s+= x[i];
}
end = System.nanoTime();
System.out.println((end-start)/1000000.0+" ms");
System.out.println(s);
}
}
> java Test
1.884 ms
4999950000
では、get は nth よりも 80 倍遅く、Java の []-access よりも約 800 倍遅いという私の結論を下すべきでしょうか?