2010-04-06 15 views
5

si tengo el códigohace un Java captador de incurrir en una penalización de rendimiento

int getA(){ 
return a; 
} 

y luego hacer algo como

int b = obj.getA(); 

en lugar de

int b = obj.a; 

significará eso que la pila tendrá que ser empujado y reventado en última instancia, ralentizando mi código?

+1

Las preguntas sobre el rendimiento en el vacío son inútiles. Haga un perfil de esto usted mismo después de determinar que está en una tira sensible al rendimiento en su aplicación. – djechlin

Respuesta

4

El compilador JIT alineará el método.

El código debería ser similar

int b = obj.GetA(); 
+0

Eso no es correcto. Un compilador C/C++ alineará este tipo de función, pero en Java no puede porque la VM no sabe si se hará referencia a la función o no (utilizando AOP, AspectJ, etc.). – cletus

+1

@cletus La VM interpreta todas las instrucciones de bytecode de Java, y por lo tanto, es consciente de ello, incluso las modificaciones realizadas por herramientas de tejido de código byte como AspectJ –

+0

@binil, Michael: ¿Cómo funciona esto a menos que el captador sea final? ¿Qué pasa con las subclases que anulan el getter? – Thilo

3

Tengo dos respuestas para usted:

  1. No creo que hay una pérdida de rendimiento significativa para el uso del captador vs acceder a la variable directamente . Me preocuparía más sobre lo comprensible y legible que es el código que el rendimiento para este tipo de decisión.
  2. De acuerdo con los principios de diseño de OO, que pueden o no ser importantes para usted, normalmente ocultaría los datos y proporcionaría el método getter para acceder a él — hay una discusión detallada sobre los méritos de este enfoque here.
+0

Por otro lado, los métodos 'get' a menudo rompen la encapsulación de todos modos (especialmente si se acompaña con un método' set'). –

1

Teóricamente hay alguna penalización de tiempo de ejecución, debido a una llamada a un método que se está realizando. En realidad, esto tiene muy poco efecto en el rendimiento global debido a dos razones:

  1. A menos que el obj.getA() está teniendo lugar dentro de la más interior del bucle de su programa, a continuación, su efecto sobre el rendimiento general de su código ser insignificante. Cuando el rendimiento es un problema, debe considerar el cuello de botella de su código. No tiene sentido optimizar el código que no está en estos puntos calientes. Para identificar estos puntos, debe analizar la ejecución de su código a través de profiler.
  2. Como @Michael decía que la JVM usa un compilador/optimizador "Just In Time" que inserta el código según la ejecución real. Realiza este tipo de optimizaciones (vea esto talk)
Cuestiones relacionadas