在我的思考中,clojure向量与java数组相比有轻微的性能提升。因此,我认为“传统智慧”是对于那些性能至关重要的代码部分,最好使用java数组。然而Clojure:为什么年龄如此之慢?
我的测试表明,这是不正确的:
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
正如你所看到的,皮亚杰增加了约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
所以,应我的结论是皮亚杰比第n个慢80倍,比[] - 访问在java中慢大约800倍?
很多工作已经进入让你不必进行这种优化:) – 2012-04-13 00:07:58
发表在奇怪的aget优化行为的后续行为http://stackoverflow.com/questions/10144937/strange-aget-optimisation-行为 – NielsK 2012-04-13 16:47:50