10

Recientemente he estado desarrollando una aplicación que procesa una gran cantidad de datos con mucha frecuencia (~ 15 veces por minuto). Para hacerlo, asigné una gran cantidad de memoria y luego la liberé para cada lote de datos.¿Es la memoria de Spiky "saludable" para la aplicación?

Aquí es una pantalla de mis asignaciones de memoria de instrumentos: The memory

el uso de la memoria oscila desde alrededor de 3 MB a 30 MB acerca bastante rápido. Me preguntaba si esto es "saludable" para el iPhone.

¿Es riesgoso asignar y liberar tanta memoria tan rápido? ¿Es insostenible o solo una mala práctica?

Gracias!

+0

Fuera de interés, ¿qué tipo de procesamiento está causando el pico? ¿Es el procesamiento de imágenes? –

+0

Sí, el análisis de imágenes en realidad, ¿cómo lo sabes? – pop850

Respuesta

7

No es ni riesgoso ni necesariamente una mala práctica. Asignar y liberar memoria lleva tiempo, por lo que hacerlo con mucha frecuencia, hacerlo una sola vez y volver a utilizar la memoria asignada es una compensación entre la eficacia del uso de la memoria (usando la menor cantidad de memoria en cada momento) y el rendimiento.

Si el rendimiento de su aplicación no sufre en este momento, probablemente haya tomado la decisión correcta con respecto a esta compensación para su aplicación.

En general, usar 30 MB de memoria es una cantidad bastante grande para dispositivos más antiguos (iPhone 3G y anteriores). No puede estar seguro de que su aplicación tenga tanta memoria disponible, así que esté preparado para las advertencias de memoria recibidas. Si su aplicación no puede reducir su uso de memoria cuando recibe una advertencia de memoria, el sistema operativo podría matarla.

+0

En mi experiencia, cualquier cantidad superior a 20-25MB provocará la muerte de una aplicación en un iPhone 3G. pop850, deberías probar esto en dispositivos más antiguos (si estás interesado en apoyarlos). Dicho eso, si tu aplicación no muere con el primer pico, hacerlo repetidamente probablemente tampoco lo matará. Mientras no haya fugas. –

+0

Creo que tendré que hacer el procesamiento en fragmentos, así que uso menos memoria, porque no quiero limitar mi audiencia a dispositivos más nuevos. Sin embargo, eso parece un poco insignificante, ya que he asignado más de 180 MB antes sin que se cuelgue en mi iPhone 4. Muchas gracias por la respuesta. – pop850

-1

Depende, si el usuario tiene un iPhone 4 o iPhone 3GS debería poder hacerlo, pero en el iPhone 3G se producirá una advertencia de memoria muy rápidamente. iPhone 4 tiene 256mb de RAM para las aplicaciones (512 mb en total) iPhone 3GS tiene 128mb para las aplicaciones, y 256 en total el iphone 3g solo tiene 128mb y 64mb para las aplicaciones .. generalmente tiene alrededor de 40mb gratis cuando no aplicaciones se están ejecutando.

como Apple dice que sólo debe asignar la memoria que realmente necesita, y tratar de no utilizar autorelease demasiado, porque autorelease nos da un objeto que está siendo asignado mientras No realmente lo necesita más

Si el el rendimiento no es tan malo, trataría de usar menos memoria y asignar más cuando realmente lo necesite.

+0

De hecho, debería utilizar grupos de liberación automática con objetos de liberación automática y usarlos siempre que sea necesario. – koo

+0

@Adam Ko, pero luego debe utilizar la versión, en la mayoría de los casos puede retener el conteo usted mismo y no tendrá que hacer una agrupación usted mismo. A menos que esté haciendo un osmething en un bucle que usa muchos objetos liberados automáticamente, obtienes un API –

+0

Sí, no estoy seguro de a qué te refieres. El comportamiento descrito en la pregunta no causará una advertencia de memoria, a menos que esté asignando grandes cantidades de memoria.Además, está haciendo algunas generalizaciones bastante grandes sobre la cantidad de memoria disponible, es incorrecto decir que 'iPhone 4 tiene 256mb para aplicaciones (512mb en total)'. Así no es como funciona en el hardware. – lxt

4

Mi principal preocupación en estas situaciones sería la fragmentación. Si los trozos son todos del mismo tamaño, deberías estar bien (y mirando tu gráfico, los picos parecen estar completamente nivelados, así que creo que ese es el caso).

Pagará los costos de asignación, pero como dice Ole, si su aplicación ya está funcionando lo suficientemente bien, no tiene sentido tratar de optimizarla.

Cuestiones relacionadas