【发布时间】:2023-03-20 11:36:01
【问题描述】:
在我看来,与 java 数组相比,clojure 向量的性能略有下降。因此,我认为“传统智慧”是对于代码中对性能至关重要的部分,最好使用 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 倍吗?
【问题讨论】:
-
为了让您不必进行这种优化,我们做了很多工作:)
-
在stackoverflow.com/questions/10144937/…发布了关于奇怪的aget优化行为的后续文章
标签: arrays performance clojure