2009-04-12 15 views

Antwort

254
NSDate *start = [NSDate date]; 
// do stuff... 
NSTimeInterval timeInterval = [start timeIntervalSinceNow]; 

timeInterval ist die Differenz zwischen Start- und jetzt, in Sekunden, mit sub-Millisekunden-Genauigkeit.

+1

+1, Nizza und Osten Antwort. Vielen Dank. :) – mAc

+5

so ist es ein negativer Wert, wenn ich richtig verstanden habe –

+18

@NicolasZozol können Sie 'fabs (...)' verwenden, um den absoluten Wert eines Floats zu erhalten. Z.B. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –

5

verwenden, um die timeIntervalSince1970 Funktion der NSDate Klasse wie unten:

double start = [startDate timeIntervalSince1970]; 
double end = [endDate timeIntervalSince1970]; 
double difference = end - start; 

im Grunde, das ist, was ich verwende den Unterschied in Sekunden zwischen zwei verschiedenen Zeitpunkten zu vergleichen. überprüfen Sie auch diesen Link here

23

Verwenden Sie die timeIntervalSinceDate Methode

NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval ist nur ein double definieren in NSDate wie folgt aus:

typedef double NSTimeInterval; 
14

Für alle, hier kommt eine GetTickCount() -Implementierung für iOS sucht, ist hier meins nach dem zusammenstellen verschiedener quellen:

#include <mach/mach.h> 
#include <mach/mach_time.h> 

uint64_t getTickCount(void) 
{ 
    static mach_timebase_info_data_t sTimebaseInfo; 
    uint64_t machTime = mach_absolute_time(); 

    // Convert to nanoseconds - if this is the first time we've run, get the timebase. 
    if (sTimebaseInfo.denom == 0) 
    { 
     (void) mach_timebase_info(&sTimebaseInfo); 
    } 

    // Convert the mach time to milliseconds 
    uint64_t millis = ((machTime/1000000) * sTimebaseInfo.numer)/sTimebaseInfo.denom; 
    return millis; 
} 
+0

Wer weiß, warum der Aufruf mach_timebase_info redundant ist (void)? –

+0

@SimonTillson das ist eine gute Frage - entweder war es erforderlich, eine Warnung zum Schweigen zu bringen, oder ich kopierte es von woanders und bemerkte nur nicht, es zu löschen. Ich kann mich nicht erinnern. –

200

Sie sollten sich nicht auf [NSDate date] für Timing-Zwecke verlassen, da es die verstrichene Zeit zu viel oder zu wenig meldet. Es gibt sogar Fälle, in denen Ihr Computer scheinbar mit der Zeit fährt, da die verstrichene Zeit negativ ist! (Z. B. wenn sich die Uhr während des Timings rückwärts bewegt).

Laut Aria Haghighi in der Vorlesung "Advanced iOS Gesture Recognition" von Winter 2013 Stanford iOS course (34:00) sollten Sie CACurrentMediaTime() verwenden, wenn Sie ein genaues Zeitintervall benötigen.

Objective-C:

#import <QuartzCore/QuartzCore.h> 
CFTimeInterval startTime = CACurrentMediaTime(); 
// perform some action 
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; 

Swift:

let startTime = CACurrentMediaTime() 
// perform some action 
let elapsedTime = CACurrentMediaTime() - startTime 

Der Grund dafür ist, dass [NSDate date] Synchronisierungen auf dem Server, so dass es zu "Time-Sync-Schluckauf" führen könnte was zu sehr schwer zu verfolgenden Fehlern führen kann. CACurrentMediaTime(), auf der anderen Seite ist eine Gerätezeit, die sich bei diesen Netzwerk-Synchronisationen nicht ändert.

Sie müssen add die QuartzCore framework zu den Einstellungen Ihres Ziels.

+14

Bitte aktualisieren Sie dies. Obwohl ich denke, dass jeder zustimmen kann, dass NSDate Ihre erste Option sein sollte, hat dieser Vorschlag ein Problem von mir gelöst. Beim Aufruf von '[NSDate date]' in einem Completion-Block innerhalb eines Dispatch-Blocks erhielt ich die gleiche "aktuelle" Zeit, die von '[NSDate date]' unmittelbar vor der Ausführung an dem Punkt gemeldet wurde, an dem meine Blöcke erstellt wurden. 'CACurrentMediaTime()' löste dieses Problem. – n00neimp0rtant

+0

Wie würden wir die elapsedTime für die Anzeige wie mm: ss verwenden? – CyberMew

+0

Warum habe ich noch nie davon gehört ... – Morkrom

1

Andere Antworten sind korrekt (mit einem Vorbehalt *).Ich füge diese Antwort einfach ein Beispiel des Verbrauches zeigen:

- (void)getYourAffairsInOrder 
{ 
    NSDate* methodStart = [NSDate date]; // Capture start time. 

    // … Do some work … 

    NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow])); // Calculate and report elapsed time. 

}

In der Debugger-Konsole Sie etwas sehen:

DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds. 

* Caveat: Wie andere erwähnt Verwenden Sie NSDate, um die abgelaufene Zeit nur für zufällige Zwecke zu berechnen. Ein solcher Zweck könnte ein gemeinsames Testen sein, ein grobes Profiling, bei dem Sie nur eine ungefähre Vorstellung davon haben möchten, wie lange eine Methode dauert.

Das Risiko besteht darin, dass sich die aktuelle Uhrzeiteinstellung des Geräts aufgrund der Synchronisierung des Netzwerktakts jederzeit ändern kann. So NSDate Zeit könnte jederzeit vorwärts oder rückwärts springen.

Verwandte Themen