Aunque esta pregunta es antigua, las cosas no han cambiado, la respuesta aceptada es incorrecta.
La enumerateObjectsUsingBlock
API no estaba destinada a reemplazar for-in
, sino a un caso de uso totalmente diferente:
- Permite la aplicación de lógica arbitraria no local. es decir, no necesita saber qué hace el bloque para usarlo en una matriz.
- Enumeración concurrente para grandes colecciones o cálculo pesado (usando el
withOptions:
parámetro)
La enumeración rápida for-in
sigue siendo el método idiomático de enumerar una colección.
La enumeración rápida se beneficia de la brevedad del código, la legibilidad y las optimizaciones adicionales que lo hacen anormalmente rápido. ¡Más rápido que un viejo C for-loop!
Una prueba rápida concluye que en el año 2014 en iOS 7, enumerateObjectsUsingBlock
es consistentemente un 700% más lento que for-in (basado en iteraciones de 1 mm de una matriz de 100 elementos).
¿Es el rendimiento una preocupación práctica real aquí?
Definitivamente no, con una rara excepción.
El punto es demostrar que hay poco beneficio al usar enumerateObjectsUsingBlock:
más defor-in
sin una buena razón. No hace que el código sea más legible ... o más rápido ... o seguro para subprocesos. (Otro concepto erróneo común).
La elección se reduce a la preferencia personal. Para mí, la opción idiomática y legible gana. En este caso, se trata de una enumeración rápida for-in
.
Punto de referencia:
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 100; i++) {
arr[i] = [NSString stringWithFormat:@"%d", i];
}
int i;
__block NSUInteger length;
i = 1000 * 1000;
uint64_t a1 = mach_absolute_time();
while (--i > 0) {
for (NSString *s in arr) {
length = s.length;
}
}
NSLog(@"For-in %llu", mach_absolute_time()-a1);
i = 1000 * 1000;
uint64_t b1 = mach_absolute_time();
while (--i > 0) {
[arr enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop) {
length = s.length;
}];
}
NSLog(@"Enum %llu", mach_absolute_time()-b1);
Resultados:
2014-06-11 14:37:47.717 Test[57483:60b] For-in 1087754062
2014-06-11 14:37:55.492 Test[57483:60b] Enum 7775447746