2016-06-30 17 views
1

Gibt es einen Unterschied in der Geschwindigkeit zwischen einem NSSet überprüfen, wenn es ein bestimmtes Objekt enthält mit [ContainsObject:] vs Verwendung von [ObjectsPassingTest: Block] mit der Stop-Variablen festgelegt zu JA, damit es nach dem ersten Spiel aufhört?Gibt es einen Unterschied in der Geschwindigkeit zwischen dem Überprüfen eines NSSet mit objectsPassingTest: vs enthältObjekt:

Wenn die Menge Objekte einer benutzerdefinierten Klasse enthält, verstehe ich, dass das containsObject die isEqual: -Methode verwendet, um die Überprüfung durchzuführen, und daher in der benutzerdefinierten Klasse überschrieben werden muss. Verlangsamt dies die containsObject-Prüfung im Gegensatz zu dem Fall, in dem das NSSset Objekte von Apple-Klassen wie NSString, NSNumber usw. enthält?

Ich plane, einige Benchmarks zu fahren, wenn ich etwas Zeit habe, aber morgen ein Interview habe und möchte die Antwort für diese eine handliche haben.

+1

Ich stimme für das Schließen dieser Frage als Off-Topic, da dies keine Frage mit einem Programmierproblem ist. – Avi

Antwort

0

Nun, Sie sollten die Benchmarks ausführen, die Sie planen, aber Sie können eine Antwort schätzen.

Eine Implementierung von containsObject: könnte iterieren Aufruf isEqual: auf jedem Mitglied; während eine Implementierung von objectsPassingTest: möglicherweise iterieren, rufen Sie den Block auf jedem Mitglied, und die Blockaufrufe isEqual: ...

Ich denke, dass Sie basierend darauf schätzen können. Haben Sie ein gutes Interview, wenn der Interviewer SO liest ...

0

Auch ich habe Probleme mit dieser Art von Qs auf SO, ich werde (teilweise) darauf antworten. Und ich glaube nicht, dass der Interviewer das Endergebnis bekommen wird, sondern Ihre Gedanken dazu.

Beide machen eine Überprüfung mit -isEqual:. Aber -containsObject: kann es direkt tun, während -objectPassingTest: einen Block aufrufen muss. Dies ist zwar nicht teuer, aber da der auszuführende Code auch nicht teuer ist, kann dies einen Leistungseinbruch verursachen.

Daneben kann -containsObject: Hashing verwenden, um ein Objekt zu finden. -objectPassingTest: in NSSet kann nicht, da es keine Ahnung hat, was der Test ist. Der Block kann das auch nicht, weil er die Objekte einzeln bekommt.

Wenn jedoch veränderbare Objekte in der Gruppe vorhanden sind, was für ein Objekt der benutzerdefinierten Klassen normalerweise ist, kann kein Hashing durchgeführt werden, da es nicht möglich ist, sinnvolle Hash-Operationen für veränderbare Objekte in einer Sammlung durchzuführen.

Also meine Schätzung: Mit unveränderlichen Objekten mit einer ordnungsgemäß implementierten -hash, -containsObject: wird -objectPassingTest: bei weitem geschlagen, sonst nicht so viel.