Efecto en GC de la utilización de variables locales frente a campos

Tengo un método 3 niveles abajo en la pila de la llamada de un método de onDraw (). Se llama cientos, a veces miles de veces por redibujo. He hecho el perfilado extenso del método de onDraw () y puedo ver que el método siguiente está tomando el 14% del total así que definitivamente digno de mirar. Necesito subir mis velocidades de fotogramas durante las operaciones de zoom y arrastre.

private void getVisiblePointsFromPath(){ double longRads = longitude * (Math.PI / 180); double latRads = latitude * (Math.PI / 180); ... } 

Cuando el método sale y los dobles salen del alcance, asumo que se convierten en elegibles para GC aunque reconozco cuando esto puede suceder no es determinista.

¿Hay algo que ganar al hacer esto:

 public class GisView extends ImageView{ private double longRads; private double latRads; private void getVisiblePointsFromPath(){ longRads = longitude * (Math.PI / 180); latRads = latitude * (Math.PI / 180); ... } } 

Supongo que este idioma hará que los dobles sean anulados y luego reasignados en cada pase, pero no resultará en basura adicional y así reducir la cantidad de GC que estoy causando. ¿O es la VM más inteligente que eso?

Tenga en cuenta que mi pregunta no es "que es más rápido" per se, es acerca de lo que es probable que conduzca a menos GC. Puedo medir la diferencia de velocidad, pero no entiendo lo suficiente de la VM Dalvik y Android GC para predecir qué causa menos basura.

Supongo que este idioma hará que los dobles sean anulados y luego reasignados en cada pase, pero no resultará en basura adicional y así reducir la cantidad de GC que estoy causando. ¿O es la VM más inteligente que eso?

Las variables locales primitivas viven en la pila , no en el montón, por lo que no necesitan ser GC'd en absoluto. Se van efectivamente tan pronto como la función regresa – porque eso borra el marco de la pila.

Dicho esto, sí, los dobles serán reasignados en cada pase, porque eso es lo que dice el código que has escrito. Si desea aumentar la velocidad de este método en particular, calcule longRads y latRads cuando se latRads longitude y latitude . La forma correcta de hacerlo es delegar siempre la configuración de esos campos a un método setter. Por ejemplo:

 public void setLongitude(double longitude) { this.longitude = longitude; this.longRags = longitude * (Math.PI / 180); } 

Esto, por supuesto, hará que la configuración de una operación más lenta, pero eso no es lo que usted pidió acerca de la optimización.

  • Manifiesto de Android que genera automáticamente permiso no válido
  • Onclicklistener para el botón en una lista
  • Uso de Eclipse para androidSDK, cuando voy a correr, me da la advertencia: La partición de datos ya está en uso. ¡Los cambios no persistirán!
  • Recuperación de datos de firebase
  • ¿Cómo agregar estéreo, las opciones de agudos en el ecualizador de audio?
  • ¿Cómo hacer que el número no sea accesible (similar al bloqueador de llamadas)?
  • ProGuard: ¿duplicado definición de biblioteca clase?
  • ¿Cómo configurar el color de fondo del estado del botón personalizado?
  • Java codificación de estilo (Android), ¿debo declarar las variables en una línea separada?
  • Android: la adición de vistas a las imágenes no se actualiza - onClick
  • Cómo configurar OnClickListener para ScrollView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.