2012-06-29 13 views
6

Asociar una clave a un mapa hash por 10000000 de tiempo. Aquí está el código Java y de salida:¿Por qué Java HashMap nativo en Clojure se ejecuta lentamente?

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 

Y entonces me llaman Java desde clojure en REPL:

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 

Tanto código de hacer lo mismo, pero la versión clojure corre exstreamly lento !!

¿Cuál es el problema?

+1

Por cierto increíble cómo esto es sólo 3 líneas (y mucho más fácil de leer) en Clojure. – erturne

Respuesta

13

Agregar tipo de pista es mejor:

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 
+0

Para obtener más información sobre sugerencias de tipo, consulte http://clojure.org/java_interop#Java%20Interop-Type%20Hints –

9

El primer paso con problemas de rendimiento como este es activar advertencias de reflexión y eliminar cualquiera.

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

También bucle y se repiten tienen la sobrecarga más bajo.

0

También puede aumentar Java velocidad de código con indicar el tamaño HashMap en la declaración

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

supongo que es un también un camino para REPL (hago no lo sé), ¿es posible reservar espacio de memoria?

+0

Esto es cierto, pero no hace mucha diferencia en este caso: el problema real es con el reflejo – mikera

Cuestiones relacionadas