Gibt es eine Möglichkeit zu bestimmen, wie viel Zeit eine Methode zur Ausführung benötigt (in Millisekunden)?
222
Gibt es eine Möglichkeit zu bestimmen, wie viel Zeit eine Methode zur Ausführung benötigt (in Millisekunden)?
Antworten:
Schnell:
Swift3:
Einfach zu bedienen und mit einer Genauigkeit von weniger als einer Millisekunde.
quelle
NSLog(@"executionTime = %f", executionTime);
NSDate
undmach_absolute_time()
auf ungefähr 30ms Niveau. 27 vs. 29, 36 vs. 39, 43 vs. 45.NSDate
war für mich einfacher zu verwenden und die Ergebnisse waren ähnlich genug, um mich nicht darum zu kümmernmach_absolute_time()
.Hier sind zwei einzeilige Makros, die ich verwende:
Verwenden Sie es so:
quelle
#define TOCK NSLog(@"%s Time: %f", __func__, -[startTime timeIntervalSinceNow])
Diese Antwort gibt auch zurück, in welcher Funktion der Timer verwendet wurde. Ich fand dies nützlich, wenn ich den TICK TOCK zum Zeitsteuern mehrerer Funktionen verwendet habe.__PRETTY_FUNCTION__
und__LINE__
wenn Sie nähere Informationen wünschen.Für ein genaues Timing unter OS X sollten Sie
mach_absolute_time( )
deklariert in verwenden<mach/mach_time.h>
:Natürlich gelten die üblichen Vorbehalte gegen feinkörnige Messungen; Am besten rufen Sie die zu testende Routine am besten mehrmals auf und mitteln / nehmen ein Minimum / eine andere Form der Verarbeitung.
Beachten Sie außerdem, dass es möglicherweise nützlicher ist, Ihre Anwendung mit einem Tool wie Shark zu profilieren . Dadurch erhalten Sie keine genauen Timing-Informationen, aber es wird angezeigt, wie viel Prozent der Zeit der Anwendung wo verbracht wird, was häufig nützlicher ist (aber nicht immer).
quelle
Es gibt einen praktischen Wrapper für
mach_absolute_time()
- es ist eineCACurrentMediaTime()
Funktion.ObjC
Schnell
quelle
NSDate
.In Swift verwende ich:
In meinem Macros.swift habe ich gerade hinzugefügt
Sie können jetzt einfach überall anrufen
quelle
\(-startTime.timeIntervalSinceNow)
(beachten Sie das Negativ)Ich weiß, dass dies eine alte ist, aber selbst ich bin wieder daran vorbeigekommen, also dachte ich, ich würde hier meine eigene Option einreichen.
Am besten schau dir meinen Blog-Beitrag dazu an: Timing der Dinge in Objective-C: Eine Stoppuhr
Grundsätzlich habe ich eine Klasse geschrieben, die auf sehr einfache Weise aufhört zu schauen, aber gekapselt ist, sodass Sie nur Folgendes tun müssen:
Und am Ende haben Sie:
im Protokoll ...
Schauen Sie sich meinen Beitrag noch einmal an oder laden Sie ihn hier herunter: MMStopwatch.zip
quelle
Ich benutze Makros basierend auf Rons Lösung.
Für Codezeilen:
Wir werden in der Konsole etwas sehen wie: TIME1: 0.096618
quelle
Ich verwende eine sehr minimale Implementierung einer Seitenklasse, die vom Code aus diesem Blog-Beitrag inspiriert ist :
Die Verwendung ist sehr einfach:
[DBGStopwatch start:@"slow-operation"];
am Anfang an[DBGStopwatch stop:@"slow-operation"];
nach dem Ziel, um die Zeit zu bekommenquelle
Mit dieser StopWatch-Klasse können Sie ein wirklich feines Timing (Sekunden, Sekunden) erzielen. Es verwendet den hochpräzisen Timer im iPhone. Wenn Sie NSDate verwenden, erhalten Sie nur eine Sekunde (n) Genauigkeit. Diese Version wurde speziell für Autorelease und Objective-C entwickelt. Bei Bedarf habe ich auch eine C ++ - Version. Die c ++ - Version finden Sie hier .
StopWatch.h
StopWatch.m
Die Klasse hat eine statische
stopWatch
Methode, die ein automatisch freigegebenes Objekt zurückgibt.start
Verwenden Sie nach dem Aufruf dieseconds
Methode, um die verstrichene Zeit abzurufen. Rufen Siestart
erneut auf, um es neu zu starten. Oderstop
um es zu stoppen. Sie können die Uhrzeit (Anrufseconds
) jederzeit nach dem Anruf ablesenstop
.Beispiel in einer Funktion (Timing-Aufruf der Ausführung)
quelle
Ich benutze diesen Code:
quelle
Ich benutze das:
Bei CLOCKS_PER_SEC auf dem iPhone bin ich mir jedoch nicht sicher. Vielleicht möchten Sie es weglassen.
quelle
Ein Beispiel für ein feinkörniges Timing
mach_absolute_time()
in Swift 4:quelle
OK, wenn Ihr Ziel darin besteht, herauszufinden, was Sie beheben können, um es schneller zu machen, ist das ein etwas anderes Ziel. Das Messen der Zeit, die Funktionen benötigen , ist ein guter Weg, um herauszufinden, ob das, was Sie getan haben, einen Unterschied gemacht hat, aber um herauszufinden, was zu tun ist , benötigen Sie eine andere Technik. Das empfehle ich , und ich weiß, dass Sie es auf iPhones tun können.
Bearbeiten: Die Rezensenten schlugen vor, die Antwort auszuarbeiten, daher versuche ich, eine kurze Möglichkeit zu finden, sie auszudrücken.
Ihr Gesamtprogramm benötigt genügend Zeit, um Sie zu stören. Angenommen, das sind N Sekunden.
Sie gehen davon aus, dass Sie es beschleunigen können. Die einzige Möglichkeit, dies zu tun, besteht darin, dafür zu sorgen, dass es in dieser Zeit nichts tut, was m Sekunden entspricht.
Sie wissen zunächst nicht, was das für ein Ding ist. Sie können raten, wie alle Programmierer, aber es könnte leicht etwas anderes sein. Was auch immer es ist, so finden Sie es:
Da dieses Ding, was auch immer es ist, einen Bruchteil m / N der Zeit ausmacht, bedeutet das, wenn Sie es zufällig anhalten, ist die Wahrscheinlichkeit m / N, dass Sie es beim Handeln erwischen. Natürlich könnte es etwas anderes tun, aber halten Sie es an und sehen Sie, was es tut.
Jetzt mach es nochmal. Wenn Sie sehen, dass es wieder dasselbe tut, können Sie misstrauischer sein.
Tun Sie es 10 Mal oder 20. Wenn Sie nun sehen, dass es in mehreren Pausen eine bestimmte Sache tut (egal wie Sie es beschreiben), die Sie loswerden können, wissen Sie zwei Dinge. Sie wissen sehr genau, wie viel Zeit es dauert, aber Sie wissen sehr genau, was zu beheben ist.
Wenn Sie auch genau wissen möchten, wie viel Zeit gespart wird, ist das ganz einfach. Messen Sie es vorher, reparieren Sie es und messen Sie es danach. Wenn Sie wirklich enttäuscht sind, ziehen Sie das Update zurück.
Sehen Sie, wie sich das vom Messen unterscheidet? Es findet, nicht messen . Die meisten Profile basieren darauf, so genau wie möglich zu messen, wie viel Zeit benötigt wird, als ob dies wichtig wäre, und das Problem der Identifizierung der zu behebenden Probleme von Hand zu lösen. Die Profilerstellung findet nicht jedes Problem, aber diese Methode findet jedes Problem, und es sind die Probleme, die Sie nicht finden, die Sie verletzen.
quelle
In Swift gibt es eine andere Möglichkeit, dies mit dem Schlüsselwort defer zu tun
Aus Apples Dokumenten : Eine Defer-Anweisung wird zum Ausführen von Code verwendet, bevor die Programmsteuerung außerhalb des Bereichs übertragen wird, in dem die Defer-Anweisung angezeigt wird.
Dies ähnelt einem try / finally-Block mit dem Vorteil, dass der zugehörige Code gruppiert wird.
quelle
Ich benutze dies in meiner Utils-Bibliothek ( Swift 4.2 ):
... rufen Sie dann eine Methode auf wie:
... was wiederum in der Konsole nach dem Ausführen so aussieht:
Nicht so präzise wie TICK / TOCK oben, aber es ist klar genug, um zu sehen, was es tut, und es enthält automatisch, was zeitlich festgelegt wird (nach Datei, Zeile am Anfang der Methode und Funktionsname). Wenn ich mehr Details haben möchte (z. B. wenn ich nicht nur einen Methodenaufruf wie üblich zeitlich terminiere, sondern stattdessen einen Block innerhalb dieser Methode terminiere), kann ich den Parameter "name =" Foo "" auf dem PrintTimer-Init hinzufügen um es etwas anderes als die Standardeinstellungen zu nennen.
quelle
Bedeutet dies nicht, dass Sie das beim Laden dieser Seiten verwendete Javascript wirklich optimieren möchten, da Sie die Zeit für den Wechsel von einer Seite zur anderen in einer UIWebView optimieren möchten?
Zu diesem Zweck würde ich mir einen WebKit-Profiler ansehen, über den hier gesprochen wurde:
http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/
Ein anderer Ansatz wäre, auf einer hohen Ebene zu beginnen und zu überlegen, wie Sie die betreffenden Webseiten so gestalten können, dass die Ladezeiten beim Laden von Seiten im AJAX-Stil minimiert werden, anstatt jedes Mal die gesamte Webansicht zu aktualisieren.
quelle
quelle
Hier ist eine Swift 3-Lösung, mit der Sie Code überall halbieren können, um einen lang laufenden Prozess zu finden.
Verwendung: -
Beispielausgabe: -
quelle
Viele Antworten sind seltsam und geben nicht wirklich Ergebnisse in Millisekunden (aber in Sekunden oder irgendetwas anderem):
hier was ich benutze um MS zu bekommen (MILLISECONDS):
Schnell:
Ziel c:
quelle
Fügen Sie für Swift 4 Ihrer Klasse einen Delegierten hinzu:
Zu unserer Klasse hinzufügen:
Fügen Sie dann Ihrer Klasse hinzu:
Wenn Sie etwas zeitlich festlegen möchten, beginnen Sie mit:
Und ende mit:
quelle