¿Cuál es más rápido? for-loop o isEqualToArray

Me gustaría saber qué es isEqualToArray

Tengo una matriz con tamaño 160, cada una contiene un dictionary con 11 inputs, pero puedo hacer la comparación simplemente en base a la primera columna (contiene la date en que se cambió la fila).

Ahora puedo hacer eso con un ciclo simple:

  BOOL different = FALSE; for (int index = 0 ; index < [newInfo count] ; ++index) if (![[[oldInfo objectAtIndex:index] objectForKey:@"Update"] isEqual:[[newInfo objectAtIndex:index] objectForKey:@"Update"]]) { different = TRUE; break; } if (different) { } else NSLog(@"Contact information hasn't been updated yet"); 

O puedo utilizar el método built-in isEqualToArray:

  if ([oldInfo isEqualToArray:newInfo]) NSLog(@"Contact information hasn't been updated yet"); else { NSLog(@"Contact information has been updated, saving new contact information"); [newInfo writeToFile:path atomically:YES]; } 

Ahora, si suponiendo que isEqualToArray simplemente invoca isEqualTo para cada celda, el método for-loop se ejecuta durante 1/11 del time isEqualToArray (solo necesita comparar una columna en lugar de 11).

Tal vez estoy demasiado en la optimization … (He estado en muchos concursos donde el time de ejecución era limitado y estoy sintiendo los efectos secundarios).

Cuando sabe que ambos objects son Arrays, el isEqualTo<Class> es una forma más rápida de verificar la igualdad que para el ciclo.

isEqualTo<Class> se utiliza para proporcionar comprobaciones específicas para equality.so isEqualToArray: comtesting que las matrices contengan un número igual de objects.

Por lo que, según mi conocimiento, puedo decir que isEqualToArray es una mejor opción cuando sabes que dos objects son matrices.

La documentation dice:

Dos matrices tienen el mismo contenido si cada una tiene la misma cantidad de objects y objects en un índice dado en cada matriz que satisfaga el isEqual: testing.

Entonces, básicamente tienes razón.

Desde el punto de vista del layout, me atrevería a isEqualToArray: ya que hace que el código sea más fácil de entender o que introduzca un BOOL hasUpdates si le preocupa el performance, lo que tiene la ventaja adicional de que no tiene que tener dos copys en memory.

Sospecho que muchas personas asumen erróneamente que el performance es proporcional al número de instrucciones de origen ejecutadas y que una function como isEqualToArray es increíblemente rápida en comparación con el bucle equivalente de código directo.

De hecho, aunque a veces los progtwigdores de estas API realmente conocen algunos "trucos del oficio" que aceleran un poco (o tienen acceso a interfaces internas que no pueden usar), tan a menudo deben arrojar lógica adicional para manejar casos "extraños" que no le interesan, o simplemente para hacer que la API sea "general".

Por lo tanto, en la mayoría de los casos, la elección debe basarse en la que más se ajuste razonablemente al progtwig general y que la lógica sea clara. En algunos casos, el bucle explícito es mejor, especialmente si uno puede aprovechar algo de la lógica (por ejemplo, para tomar un "máximo" requerido más tarde de los valores de la matriz) para evitar la duplicación de esfuerzos.

Además, cuando hay una function API compleja (más compleja que isEqualToArray), no estás muy seguro de que entiendas, a menudo es mejor codificar cosas de una manera directa en lugar de lidiar con la function compleja. Una vez que tenga el código funcionando, puede volver y "optimizar" las cosas para usar la compleja API.