Array filter vs. Core Data pull performance

Me pregunto sobre las diferencias de performance entre dos methods diferentes de filtrado de datos. Esto es lo que estoy trabajando:

  • Un set de objects de datos centrales
  • Un UISegmentedControl que representa un filter boolean (aprendido vs. no aprendido)
  • Un UITableView que muestra el set de datos filtrados.

Según lo veo, hay dos enfoques posibles aquí:

  1. Extraiga todo el set de datos del núcleo en viewDidLoad. Filtre la matriz de datos usando un pnetworkingicado cuando cambie el valor de control segmentado. Vuelva a cargar la vista de tabla.
  2. Inicialmente extraiga el set de datos del núcleo con un pnetworkingicado. Cuando el valor del control segmentado cambia, vuelva a tirar del set de datos del núcleo con el pnetworkingicado actualizado. Vuelva a cargar la vista de tabla.

Sé que hay factores que influyen en la respuesta (cuán grande es el set de datos, con qué frecuencia se usará el control segmentado), solo me pregunto si hay una mejor práctica general entre los dos.

No espero que haya una diferencia de velocidad perceptible por el usuario.

Por lo tanto, estas son las mejores prácticas que creo que son relevantes aquí:

  1. Evite la optimization prematura.
  2. Estás limitado por la memory con más frecuencia que la velocidad.
  3. Diseño por adelantado.

De esto deduzco tres puntos de asesoramiento que se aplican al problema actual:

  1. Vaya con el método que sea más fácil de mantener.
  2. No extraiga más objects de Core Data de lo necesario.
  3. Tenga alguna estrategia sobre la actualización de los datos en la vista de tabla.

Para combinar esos puntos en un consejo, lo mejor es usar la class NSFetchedResultsController para mostrar Datos básicos en tablas, ya que está específicamente diseñada para este propósito:

  1. Encapsula la idea de "la porción de datos que muestro actualmente".
  2. Te ahorra memory al no tirar cosas que no necesitas.
  3. Ayuda con la actualización de datos en tableview.

Puede jugar con ejemplos al crear un nuevo proyecto basado en Core Data en Xcode (4.4 o posterior). Está más cerca del segundo de tus enfoques.

Hay intercambios entre los dos enfoques, y la mejor opción depende de la importancia de las diferencias para usted. Ningún enfoque es la mejor práctica para cada situación.

Cargando todo por adelantado en una matriz probablemente tenga:

  • El time de inicio más lento (debido a hacer una gran búsqueda de inmediato)
  • Mayor uso de memory (ya que está obteniendo todo en lugar de solo un subset)
  • Más rápido al cambiar entre opciones de filter (dado que ya tiene los datos)

Hacer una nueva búsqueda siempre tendrá:

  • Tiempo de inicio más rápido
  • Menor uso de memory (dado que solo tiene un subset de la colección total)
  • Más lento al cambiar entre opciones de filter, al less al principio (la caching de fila interna de Core Data acelerará las cosas en los interruptores posteriores).

Qué tan importantes son los factores depende de sus datos y su aplicación. Si tiene muchos datos, el uso de la memory puede ser significativo (get cada instancia de un tipo de entidad es una manera fácil de agotar el uso de la memory). Las preocupaciones de velocidad dependen de qué otra cosa esté haciendo su aplicación al mismo time y, francamente, de si cualquiera de las dos opciones es lo suficientemente lenta como para causar una demora notable. Si su set de datos es pequeño, probablemente no haga mucha diferencia en el enfoque que usa.