KVC vs enumeración rápida

¿Cuál de las siguientes es más rápido y por qué?

CGFloat sum = 0; for (UIView *v in self.subviews) sum += v.frame.size.height; 

o

 CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue]; 

Realmente, mucho de lo elegante (o inteligente) que es un lenguaje se networkinguce a lo bien que evita los loops. por, mientras; incluso las expresiones de enumeración rápida son un arrastre. No importa cómo los cubres, los loops serán un bloque de código que hace algo más fácil de describir en lenguaje natural.

"Consígame el salario promedio de todos los empleados en este set",

 double totalSalary = 0.0; for (Employee *employee in employees) { totalSalary += [employee.salary doubleValue]; } double averageSalary = totalSalary / [employees count]; 

versus…

Afortunadamente, Key-Value Coding nos da una manera mucho más concisa, casi como Ruby, de hacer esto:

 [employees valueForKeyPath:@"@avg.salary"]; 

Los operadores de recostackción de KVC permiten realizar acciones en una colección utilizando la notación de ruta de key en valueForKeyPath:.

Cada vez que ve @ en una ruta key, denota una function agregada particular cuyo resultado se puede devolver o encadenar, al igual que cualquier otra ruta key.

La enumeración rápida es más rápida que KVC.

Espero que te ayude.

Primero, tu expresión de KVC no funcionará; KVC no puede utilizarse para recuperar miembros de struct (excepto en casos muy limitados donde una class tiene una implementación especial de valueForKey: que hace un procesamiento especial).

En segundo lugar, esto huele a una optimization prematura.

¿Realmente has cuantificado un problema de performance relacionado con este código?

De lo contrario, estás perdiendo el time "optimizando" esta ruta de código.

Aparte de eso, el uso de KVC para tales operaciones agrega considerable fragilidad a su código. El comstackdor no puede verificar la expresión que pasó a valueForKey: y, por lo tanto, lo que sería un error o advertencia de time de compilation ahora es un error en el time de ejecución que solo se encontrará si ejecuta ese código de ruta.

También eche un vistazo en los documentos de Apple:

Aunque la encoding de valor key es eficiente, agrega un nivel de indirección que es ligeramente más lento que las invocaciones de methods directos. Debe utilizar la encoding de valor key solo cuando pueda beneficiarse de la flexibilidad que proporciona.

Documentos key de encoding de valor