6

キーをハッシュ マップに 10000000 時間関連付けます。Java コードと出力は次のとおりです:</p>

import java.util.HashMap;

public class TestMap {
    public static void main(String[] args) {
        HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
        long  start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            mp.put(1, 1);
        }
        long end = System.currentTimeMillis();
        System.out.println("Elapsed time: " + (end - start) + " msecs");
    }
}


$ javac TestMap.java && java -cp . TestMap
Elapsed time: 38 msecs

そして、REPL で clojure から Java を呼び出します。

user=> (import java.util.HashMap)
java.util.HashMap
user=> (def mp (HashMap.))
#'user/mp
user=>  (time (dotimes [n 10000000] (.put mp 1 1)))
"Elapsed time: 10024.797 msecs"
nil

どちらのコードも同じことを行いますが、clojure バージョンは非常に遅く実行されます!!

どうしたの?

4

3 に答える 3

13

タイプヒントを追加する方が良い:

user> (import 'java.util.HashMap)
java.util.HashMap
user> (def mp (HashMap.))
#'user/mp
user> (time (dotimes [n 10000000] (.put mp 1 1)))
"Elapsed time: 13932.248126 msecs"
nil
user> (time (dotimes [n 10000000] (.put ^HashMap mp 1 1)))
"Elapsed time: 117.915992 msecs"
nil
于 2012-06-29T04:04:19.140 に答える
9

このようなパフォーマンスの問題の最初のステップは、リフレクション警告をオンにして削除することです。

 (set! *warn-on-reflection* true)

また、ループと繰り返しのオーバーヘッドが最も低くなります。

于 2012-06-29T03:42:58.487 に答える
0

宣言で HashMap サイズを宣言することで、Java コードの速度を上げることもできます。

HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(10000000);

REPLの方法でもあると思いますが(わかりません)、メモリスペースを予約することはできますか?

于 2012-06-29T07:04:24.640 に答える