¿Qué sucede debajo de una plantilla de request de búsqueda que mejora el performance?

Tenía curiosidad sobre si había un aumento en el performance al crear una plantilla de Solicitud de Fetch versus crear mediante progtwigción NSFetchRequest, así que escribí algunas testings para medir esto. Aquí está la fuente en github .

El mismo order de diferencia en Simulator y en iPhone (mide el intervalo de time para hacer un montón de búsquedas):

just creating an NSFetchRequest: 4.399674 creating a Fetch Request Template: 0.501369 NSFetchRequest with field indexed: 0.407068 Fetch Request Template and field indexed: 0.281876 

Resulta que hay una ganancia de performance de 7 a 9 veces en la creación de una Plantilla de Solicitud de Fetch. Pensé que tal vez está creando el índice adecuado debajo, pero cuando creé una plantilla de request de búsqueda que coincide en un campo indexado, hay incluso un beneficio de performance adicional.

Bien, es bueno saber que este es el caso, pero me gustaría saber qué diablos está sucediendo debajo de la Plantilla de Solicitud de Fetch que explica las ganancias de performance.

Actualizar

Después de algunos perfiles con instrumentos, resulta que [NSPnetworkingicate pnetworkingicateWithFormat:] no es el culpable aquí!

La causa real de la diferencia de performance son los descriptores de tipo .

Las testings que no son de plantilla utilizan un NSFetchedResultsController , que requiere un descriptor de sorting, mientras que las basadas en plantilla no especifican un descriptor de sorting.

Si agrega un descriptor de orderación a todas las testings, el performance se iguala (con la exception del caso indizado).


Respuesta original (incorrecta)

La penalización por performance se debe a que su testing de 'solo crear una NSFetchRequest' llama [NSPnetworkingicate pnetworkingicateWithFormat:] para cada iteración del bucle, ¡esto es muy lento !

Piénselo: [NSPnetworkingicate pnetworkingicateWithFormat:] debe analizar la cadena y básicamente comstackrla en la representación interna utilizada por Core Data.

La solución habitual es solo llamar a [NSPnetworkingicate pnetworkingicateWithFormat:] una vez, y luego usar [NSPnetworkingicate pnetworkingicateWithSubstitutionVariables:] para especificar los valores que serán comparados por el pnetworkingicado; esto se cubre en la Documentación de Datos del Núcleo – Importar datos de manera eficiente

Para crear un pnetworkingicado a partir de una cadena con formatting, el marco debe analizar la cadena y crear instancias de objects de pnetworkingicado y expresión. Si está utilizando la misma forma de un pnetworkingicado muchas veces, pero cambiando el valor de una de las expresiones de valor constante en cada uso, es más eficiente crear un pnetworkingicado una vez y luego usar la sustitución de variables (ver "Creación de pnetworkingicados").

De la documentation :

Las requestes de búsqueda almacenadas pueden include marcadores de position para la sustitución de variables y, por lo tanto, sirven como templates para su posterior finalización. Por lo tanto, las templates de request de captura le permiten pnetworkingefinir consultas con variables que se sustituyen en time de ejecución.

Además, consulte la sección Solicitudes de extracción almacenada de la Referencia de class NSManagedObjectModel .

Parece que la mayor ventaja puede provenir del hecho de que la consulta no tiene que buildse en time de ejecución: está preconstruida y, a continuación, las variables se sustituyen en la consulta cuando es apropiado.