在我的思考中,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