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.
- NullPointerException en IabHelper.queryPurchases
- Máscara Libgdx con imagen
- ViewRootImpl.setPausedForTransition (boolean) NullPointerException en ActivityTransitionCoordinator cuando la transición a otra Actividad se invoca demasiado pronto
- ¿Es posible usar VectorDrawable en Botones y TextViews usando android: DrawableRight?
- Cambiar la vista de lista
¿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.
- Contenido de la barra ActionBar que se superpone
- Cómo publicar HTTPS en Android
- Impedir el clic de Android ImageVIew?
- Comunicación entre servicio y actividad en una aplicación android mediaplayer
- NDK vs JAVA rendimiento
- Android java obtener html etiqueta de imagen de cadena
- ¿Cómo almacena una colección de cadenas en SQLite en Android?
- Causado por: android.database.sqlite.SQLiteException: near "": error de sintaxis (código 1):, al compilar:
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.