2008-12-01 11 views
7

Tenía curiosidad por saber si alguien tenía algún número difícil en torno a la diferencia de rendimiento entre entidades anotantes que usan campos privados en lugar de métodos public getter. He oído a la gente decir que los campos son más lentos porque se llaman "a través de la reflexión", pero también lo son los métodos getter, ¿no? Hibernate necesita establecer la accesibilidad del campo en verdadero antes de que intente leerlo, lo que puedo ver teniendo leve sobrecarga. Sin embargo, ¿no se haría eso en el nivel de clase en el ámbito de una sesión o quizás solo una vez cuando se lea la configuración y se genere SessionFactory?Diferencia de rendimiento entre campos anotadores o métodos getter en Hibernate/JPA

Simplemente curioso si esto es un mito o si realmente hay verdad en él; Personalmente, me parece que anotar los campos es un poco más legible.

Respuesta

8

Loaded 5000 registros en una sencilla tabla de 3 columnas. Asignadas dos clases a la mesa , uno que usa campos privados anotados y otro que usa getters públicos anotados. Ejecuta 30 ejecuciones de HibernateTemplate.loadAll() de Spring seguido de HibernateTemplate.clear() para purgar el caché de sesión. Resultados en ms a continuación ...

methods total : 6510, promedio: 217

total de campos: 6586, promedio: 219

Probablemente debería tomar otra puñalada después de agregar más propiedades a cada clase, pero en este momento la diferencia no parece ser estadísticamente significativa.

+3

5000 registros no es estadísticamente significativo. ¿Puedes probarlo con una estructura de entidad más compleja (que necesitaría uniones) y con algo así como 100x el número de registros? Siempre tendrá un rendimiento rápido con pequeños conjuntos de datos. –

0

ok, no puedo dar números jaja, pero supongo que acceder a los campos a través de la reflexión no sería una cosa de 'una vez'. Cada objeto tiene sus propios miembros privados.

Honestamente, no sé mucho sobre la reflexión, pero el comprador/instalador debe ser directo. De hecho, puede intentar configurar uno de los métodos como privado y creo que no funcionará porque no puede encontrar el método que necesita.

Existen otros problemas, como los proxies, que afectarán a los métodos getter, dependiendo de cómo cargues tus entidades.

Esto es todo lo que veo en la documentación:

El atributo de acceso le permite controlar cómo Hibernate acceder a la propiedad en tiempo de ejecución. Por defecto, Hibernate llamará a al par get/set de la propiedad. Si especifica access = "field", Hibernate va a omitir el par get/set y acceder al campo directamente, utilizando la reflexión. Usted puede especificar su propia estrategia para el acceso a la propiedad al nombrar una clase que implementa la interfaz org.hibernate.property.PropertyAccessor.

Mi conjetura es que la reflexión, en general, va a ser un costo más alto, aunque, pero lo siento .. no hay números :(

+1

Los métodos get/set también deben invocarse a través de la reflexión.No hay forma de que Hibernate pueda saber qué pares get/set necesitará invocar en una clase. Mi punto sobre la configuración de la accesibilidad es que se hace a nivel de clase en una instancia de java.lang.reflect.Field ... –

+0

ahh sí, creo que tiene sentido ya que tiene que buscar los nombres reales. –

+0

@ cliff.meyers Siempre es tiempo de compilación ... Hibernate usa generación de clases y AFAIK coloca una clase de ayuda en el paquete de entidad por lo que no necesita reflexión excepto para miembros 'privados' (el paquete privado está bien). – maaartinus

0

Generalmente utiliza la anotación en la parte superior de los métodos captadores, porque cuando la clase está cargada en JVM ath ese modelo hibernate o clase de entidad también se carga, si usas la anotación anterior de campo o peroperty se ejecutará una vez al tiempo de cada solicitud. mientras que si coloca encima getter luego en reflaction o cualquier otra capa cuando calificará esta clase, entonces el método getter llamado entonces se volverá muy útil

+1

¿Podría mejorar la redacción de su respuesta? No creo que esto proporcione algo nuevo que no haya sido cubierto en las respuestas existentes, por lo que probablemente sería mejor en un comentario a una respuesta marcada existente. – Dutts

Cuestiones relacionadas