2011-07-07 16 views
23

Sugerí devolver Collections.unmodifiableList() en lugar de devolver directamente una variable miembro, y a mi colega le preocupa que se produzca un golpe de rendimiento. Por supuesto, la mejor respuesta es medirlo, y podemos hacerlo, pero me gustaría saber sus experiencias y cualquier referencia, pro o contra.¿Existe algún riesgo de rendimiento para Collections.unmodifiableList?

+2

Este es el tipo de micro-optimización prematura sin fundamento que me vuelve loco. Asegúrese de señalar a su colega a estas respuestas y al código fuente en sí. – duffymo

+0

Gracias, Duffy; Lo haré. Prefiero tomarme el tiempo para medir (y aún podría), pero es bueno tener respuestas claras aquí, no solo para mí, y no solo por esta vez. Esperé que encontraría una pregunta en este sentido ya formulada y bien respondida aquí. Cuando no lo hice, bueno, pregunté. –

+1

@duffymo estuvo de acuerdo por completo. @Carl Manaster, la pregunta que debe hacerle a su colega es "el rendimiento alcanzado en comparación con qué?" Puede obtener la respuesta incorrecta en tiempo cero si eso es lo que desea. No lo es – EJP

Respuesta

23

No. Al menos, el OpenJDK implementation literalmente "sustituye a" los métodos de modificación con UnsupportedOperationException s, el resto agrega un nivel de indirección, que solo debe hacerse la distancia optimizado por el compilador VM (y aún así, un nivel de indirección no sería costoso).

Si desea devolver una lista que no se puede modificar, cualquier impacto en el rendimiento sería insignificante en comparación con la pérdida en la corrección, no lo evitaría solo por el rendimiento, y ciertamente no lo evitaría si fuera eso necesitas.

+6

Optimizado por la máquina virtual (Hotspot), no el compilador de Java. –

7

Si observa la implementación, verá que Collections.unmodifiable es solo una envoltura delgada alrededor de la colección real que arroja una excepción para todos los métodos remove/add en lugar de reenviarlo. Así que no, no hay ningún golpe de rendimiento (la llamada de reenvío estará marcada por el JIT).

Así que sí, definitivamente debe devolver una colección no modificable en lugar de la original la mayoría de las veces, una práctica de codificación mucho mejor.

3

Si el JIT enumera las funciones, no. Si no es así, entonces sí, un ligero impacto en el rendimientova a pasar, pero lo más probable es no será capaz de notar que menos que tenga un bucle estrecho muy.

Es probable que alinee la función, a menos que tal vez compile para la depuración.

Cuestiones relacionadas