Frage

Ich möchte meiner Ziel-C-Anwendung einen automatisierten Leistungstest hinzufügen. (Dies ist ein Spiel, so dass ich die aktuelle Leistung der wichtigsten Teile des Engine sehen möchte, indem ich einfach eine Reihe von Tests durchführt.) Um dies zu tun, möchte ich eine Timing -Support -Routine schreiben, so etwas wie diese:

- (void) benchmarkSelector: (SEL) msg onObject: (id) target
{
    // run the selector thousands of times, print detailed stats
}

Das Problem ist, dass ich an Millisekunden interessiert bin und ich befürchte, dass ich anrufen kann performSelector Im Benchmarking -Code würde die Ergebnisse viel verzerren. Wie würdest du das herumgehen? Soll ich runter gehen objc_msgSend?

War es hilfreich?

Lösung

Verwenden methodForSelector:, was einen Funktionszeiger auf die tatsächliche Implementierung zurückgibt, wie SO:

IMP methodImp = [target methodForSelector:msg];
for (int i=0; i<1000; ++i) {
    NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
    methodImp(target, msg);

    NSTimeInterval duration = [NSDate timeIntervalSinceReferenceDate] - start;
    // Do something with duration
}

Beachten Sie, dass diese Strategie nützlich ist, um die tatsächliche Laufzeit einer Methode zu messen. Wenn Sie sie jedoch mit Standard-Syntax für die Syntax für objektive C-Nachrichten aufrufen, ist es möglicherweise genauso relevant, den Overhead für Nachrichten zu einem Anzug in den Ihre Messungen.

Beachten Sie auch, dass Sie das Ergebnis von der Methode tatsächlich andere Parameter einnehmen sollten methodForSelector: zu einem Funktionszeiger mit den entsprechenden Parametern, um eine unerwartete Umwandlung von Floats in Doppel usw. zu vermeiden NSObject Class Referenz Weitere Informationen und Beispiele.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top