2009-03-12 22 views
5

Tengo un requisito de que se construirá un mapa con hasta 50 ~ 200 entradas (podría ser más, llamémoslo no demasiado pequeño de todos modos). La escritura solo se realiza una vez y la lectura (usando Map.get ("keyName")) puede ir más de 20 por solicitud (es una aplicación web).Write-Once + Read-Numerous Map in Java?

voy por Hashmap actualmente, ya que (supongo) me da el rendimiento más óptimo (nota: numerosas lecturas por petición). Al no ser un tipo de estructura de datos, ¿alguno de ustedes puede sugerirme una implementación de Mapa que se ajuste mejor a mis requisitos, por ejemplo, de los paquetes java.lang. *, Apache commons, etc.?

YC

Respuesta

7

A menos que tenga problemas de rendimiento (y los haya rastreado hasta este código) no me preocuparía.

Y antes de que intentara reemplazar el Mapa me vería en qué, exactamente, lo que necesito hacer búsquedas de 4000 (200 entradas en un 20 lee cada una) para generar una página web.

Pero en una apuesta supongo que el tiempo para hacer las búsquedas de 4000 se volverán a ser insignificante en comparación con otras partes del proceso.

+0

Razonar podría ser que es una especie de disparador de Excel en línea y hay un código legado desagradable detrás. Sin embargo, HashMap es extremadamente rápido (¡ConcurrentHashMap es aún más rápido!) Y si el mapa se llama 4000 veces por solicitud, JIT volverá a optimizarlo al máximo sobre la marcha de todos modos. – Esko

+0

@Esko ¿Es ConcurrentHashMap más rápido? Utiliza Iterator para recorrer todo el valor clave frente al índice hash + de HashMap. yc – yclian

2

Si todas las escrituras se realizan antes que cualquiera de las lecturas entonces se podría utilizar el método Collectons.unmodifiableMap.

Si ese no es el caso, entonces la escritura de código para hacer lo que desea no es terriblemente duro (se sale para afuera para encontrar el puesto que tiene el código básico en ella ...)

Hmm ... solo para estar seguro de que la pregunta es en qué estoy pensando ... ¿es el aspecto de solo lectura la parte importante o está intentando acceder a los datos rápidamente la parte más importante?

Editar: (basado en comentario)

¿Ha comprobado para ver, con un generador de perfiles si el código es lento? Si no, entonces no debería preocuparse por eso todavía.

+0

Gracias por la respuesta. El último (lectura múltiple) es más importante. La razón por la que mencioné sobre solo lectura, porque estaba pensando si el hash/indexación podría de alguna manera mejorarse debido a esto. yc – yclian

+0

Mapa no modificable es solo una envoltura alrededor del mapa subyacente; en realidad perjudicará el rendimiento para agregar este nivel adicional de delegación. – erickson

+0

sí, de ahí mi pregunta sobre si solo se leía era más importante que la velocidad y preguntaba si el código estaba perfilado y sabía que era lento :-) – TofuBeer

1

Si esto fuera realmente un cuello de botella, me gustaría cambiar el tamaño del mapa para evitar colisiones.

0

Si se escribe estrictamente en el principio, antes de que comiencen los lectores, por lo que la sincronización y el intercambio a través de los hilos no son cuestiones ... HashMap es su amigo. Cuando no está seguro de eso: ConcurrentHashMap.

Ambas implementaciones son parte del JDK.

0

Hace varios años (como proyecto escolar), implementé en C un mapeo write-once read-many (y otras colecciones) que tomó una colección existente, y luego "selló" creando una memoria mucho más y representación eficiente de la caché (por ejemplo, un gráfico se almacenó como una matriz optimizada). Vimos increíbles diferencias de rendimiento.

Desde Java soporta interfaces, implementar algo como esto puede ser mucho más fácil (y de hecho animado) pero no estoy familiarizado con una aplicación fuera de la caja.

1

Si realmente vale la pena, puede intentar perfect hashing. Aunque no estoy familiarizado con ninguna implementación de Java.