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?
Respuesta
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.
Optimizado por la máquina virtual (Hotspot), no el compilador de Java. –
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.
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.
- 1. ¿Existe algún riesgo al usar @ Html.Raw?
- 2. ¿Algún riesgo al usar Macports?
- 3. ¿Existe algún riesgo al ejecutar file_put_contents() en el mismo archivo desde diferentes subprocesos de PHP?
- 4. ¿Hay algún riesgo real derivado de los contenedores C++ STL?
- 5. ¿Existe algún JLabel MultiLine?
- 6. ¿Existe un riesgo de seguridad al ejecutar aplicaciones web en debug = "true"?
- 7. ¿Algún riesgo de devolver el ID de conexión de otro usuario al cliente?
- 8. ¿Hay algún tipo de "modo de rendimiento estricto" para MySQL?
- 9. ¿Existe algún comentario en IL?
- 10. ¿LIMIT 1 tiene algún aumento de rendimiento?
- 11. ¿Existe algún problema de rendimiento al usar ISNULL() en SQL Server?
- 12. ¿Existe algún comprobador de sintaxis para GNU R
- 13. ¿Existe el riesgo de que una gema Ruby actúe como un troyano?
- 14. ¿Nombra los campos de tu formulario lo mismo que mysql realmente presenta algún riesgo de seguridad?
- 15. ¿Existe algún paradigma bien conocido para iterar los valores enum?
- 16. ¿Existe algún reemplazo para PHPDocumentor que admita PHP 5.3?
- 17. ¿Cuál es la diferencia entre ImmutableList de Google y Collections.unmodifiableList()?
- 18. Rendimiento SQL: ¿Hay algún golpe de rendimiento usando NVarchar (MAX) en lugar de NVarChar (200)
- 19. ¿La expresión regular de Java ofrece algún beneficio de rendimiento?
- 20. Buscando recursos para explicar un riesgo de seguridad
- 21. Riesgo de seguridad de habilitar MSDTC
- 22. ¿Hay algún problema de rendimiento con Inner Join?
- 23. memoria riesgo de fugas en JavaScript cierres
- 24. ¿Existe algún tipo de "clase de expresión" (C++)
- 25. MIPS Pipeline Forwarding (riesgo doble de datos)
- 26. Conversión de tipo general sin riesgo Excepciones
- 27. ¿Hay algún resultado de prueba de rendimiento para el uso de sugerencias probables/improbables?
- 28. ¿Existe algún beneficio en el rendimiento al especificar explícitamente el enlace OneWay cuando se configuran enlaces en WPF?
- 29. ¿Existe algún control de versión centralizada más rápido que SVN?
- 30. ¿Existe algún framework de crawler web java script
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
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é. –
@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