2010-10-12 10 views
6

Estoy diseñando una función (método Java) que se ejecutará 40-80 veces por segundo en un dispositivo móvil.Cómo diseñar una función extremadamente eficiente

Quiero evitar producir una tonelada de variables muertas que se recopilan por GC, ya que la función se ejecuta (posiblemente durante toda la vida de la aplicación).

En C podría usar volatile por ejemplo, para evitar la asignación de memoria de mis variables en cada ejecución de la función ... Quiero hacer algo similar en Java pero no sé cómo.

Los almacena los datos de función en

  • 1 cadena
  • 4 enteros
  • matrices de cadenas
  • 2 1-dimensionales

En general, en Java, ¿cuál es el método preferido para el uso de las variables anteriores, pero no reasignándolos cada vez que se ejecuta mi función (más de 40 veces por segundo)?

Las variables miembro "funcionarían" pero ¿es esta la mejor solución?

Gracias! Brad

+0

¿tiene que ser reentrante? – Nim

+2

código de muestra sería útil –

+2

¿Te interesa más de 40 veces por segundo en un dispositivo móvil? –

Respuesta

3
  • Envuelve esos campos en una clase {Java adora ver el objeto} y lo asigna una vez y lo usa.
  • mantener cadena piscina concepto en mente cuando usted tiene Array cadena
+0

-1. Usar un campo estático no tiene absolutamente nada que ver con la frecuencia con que se asigna algo. La ÚNICA cosa relevante es la frecuencia con la que se crean los objetos (por ejemplo, la frecuencia con la que se usa el operador 'new') –

+0

@ Mark que es igualmente cierto. Comprueba mi respuesta –

+0

Estático significa que no cambiará. El problema es que las variables se calculan durante cada llamada a la función. –

0

estoy totalmente de acuerdo con esa respuesta.

Cada llamada a su función asignaría más memoria si crea las variables sobre la marcha, ya que el GC de Java no se limpia completamente hasta que se invoca destroy cuando se elimina la clase.

Pero si va a llamar a la función varias veces, también sería útil hacer que sean variables miembro de la clase.

0

Puede usar variables estáticas para esto, pero eso supone que estas variables son constantes o que cambian a ellas para no influir negativamente en otros hilos que actualmente llaman a la misma función.

Si su código debe ser reentrante y las variables estáticas no son una opción, puede crear un objeto simple portador de datos que contenga estas variables y lo pase como argumento a su función. El entorno de llamada puede decidir si compartir estos objetos o no.

1

Vars miembros estáticos, no se descargarán hasta que la clase esté descargada. Tenga en cuenta que si se pierden todas las referencias a la clase, es posible que pueda ser sometida a GC. Dudo que sea un problema en su caso, sin embargo, vale la pena señalarlo. Además, si está creando nuevas instancias de la clase que contiene los miembros estáticos vars, estará en el mismo barco desde una posición de asignación.

0

Utilice campos de clase estáticos, o si va a crear solo una instancia de su clase, las variables de miembros normales funcionarán.

Si necesita cambiar el contenido de String, considere utilizar un StringBuilder en lugar de instancias de cadena inmutables que se crearán/gc'ed.

Los int son primitivos, por lo que no son un problema.

Sus conjuntos de cadenas estarán bien, pero piense en lo que les está poniendo. ¿Estás construyendo nuevos objetos String y dejando los viejos gc?

Cuestiones relacionadas