Ho bisogno di ottenere il tempo trascorso tra due eventi: ad esempio tra l'aspetto di UIView e tra la prima reazione dell'utente.Tempo trascorso (Objective-c)
risposta
NSDate *start = [NSDate date];
// do stuff...
NSTimeInterval timeInterval = [start timeIntervalSinceNow];
timeInterval
è la differenza tra partenza ed ora, in secondi, con precisione sub-millisecondo.
utilizzare la funzione timeIntervalSince1970 della classe NSDate come di seguito:
double start = [startDate timeIntervalSince1970];
double end = [endDate timeIntervalSince1970];
double difference = end - start;
in fondo, questo è quello che uso per confrontare la differenza in secondi tra 2 date differenti. controllare anche questo link here
Per misure di tempo percise (come GetTickCount), anche dare un'occhiata a mach_absolute_time e questo di Apple Q & A: http://developer.apple.com/qa/qa2004/qa1398.html.
utilizzare il metodo timeIntervalSinceDate
NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];
NSTimeInterval
è solo un double
, definire in NSDate
come questo:
typedef double NSTimeInterval;
Per chiunque di venire qui in cerca di un'implementazione GetTickCount() per iOS, ecco il mio dopo aver messo insieme varie fonti:
#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;
}
Qualcuno sa perché c'è un cast ridondante (vuoto) sulla chiamata mach_timebase_info? –
@SimonTillson questa è una buona domanda: o era necessario silenziare un avviso, o l'ho copiato da qualche altra parte e semplicemente non ho notato di cancellarlo. Non riesco a ricordare. –
Non si deve fare affidamento su [NSDate date]
per motivi di temporizzazione poiché può sovrascrivere o sottovalutare il tempo trascorso. Ci sono persino casi in cui il tuo computer sembrerà viaggiare nel tempo poiché il tempo trascorso sarà negativo! (Ad esempio, se l'orologio si sposta all'indietro durante i tempi.)
Secondo Aria Haghighi nella conferenza "Advanced iOS Gesture Recognition" dello Winter 2013 Stanford iOS course (34:00), è necessario utilizzare CACurrentMediaTime()
se è necessario un intervallo di tempo preciso.
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
La ragione è che [NSDate date]
sincronizza sul server, in modo che potesse portare a "singhiozzo Time-Sync" che può portare a bug molto difficili da tracciare. CACurrentMediaTime()
, d'altra parte, è un orario del dispositivo che non cambia con questi sincronismi di rete.
È necessario add il QuartzCore framework per le impostazioni del target.
Si prega di aggiornare questo. Anche se penso che tutti possano essere d'accordo sul fatto che NSDate dovrebbe essere la tua prima opzione, questo suggerimento ha risolto un mio problema. Quando chiamavo '[data NSDate]' all'interno di un blocco di completamento all'interno di un blocco di invio, ricevevo lo stesso tempo "corrente" che veniva segnalato da "[data NSDate]" immediatamente prima che l'esecuzione colpisse il punto in cui i miei blocchi erano stati creati. 'CACurrentMediaTime()' ha risolto questo problema. – n00neimp0rtant
Come useremmo il tempo trascorso per la visualizzazione come mm: ss? – CyberMew
Perché non ne ho mai sentito parlare ... – Morkrom
Altre risposte sono corrette (con un avvertimento *).Aggiungo questa risposta semplicemente per mostrare un esempio di utilizzo:
- (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.
}
Sul debugger console, si vede qualcosa di simile:
DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds.
* Caveat: Come altri hanno detto , utilizzare NSDate
per calcolare il tempo trascorso solo per scopi casuali. Uno di questi potrebbe essere un test comune, una profilazione grezza, in cui si desidera solo un'idea approssimativa di quanto tempo impiega un metodo.
Il rischio è che l'impostazione dell'orario corrente dell'orologio del dispositivo possa cambiare in qualsiasi momento a causa della sincronizzazione dell'orologio di rete. Quindi il tempo NSDate
potrebbe saltare avanti o indietro C in qualsiasi momento.
- 1. tempo trascorso da JVM
- 2. Tempo trascorso calcolo
- 3. CABasicAnimation corrente tempo trascorso
- 4. Tempo trascorso dall'avvio dell'applicazione
- 5. mclapply tempo utente maggiore del tempo trascorso
- 6. Tempo trascorso programma in esecuzione
- 7. Tempo di tracciamento trascorso nel debugger
- 8. Misurazione del tempo CPU trascorso in Julia
- 9. veloce il tempo trascorso su linux
- 10. Netbeans - Tracciamento del tempo trascorso nel progetto
- 11. Come calcolare il tempo trascorso nell'applicazione Facebook?
- 12. Misurazione del tempo trascorso in python
- 13. Ottenere il tempo trascorso in Qt
- 14. Misura tempo trascorso su applicazioni Android
- 15. /usr/bin/tempo --format uscita tempo trascorso in millisecondi
- 16. Come si ottiene il tempo trascorso in millisecondi in Ruby?
- 17. Perché ricevo un tempo trascorso negativo utilizzando System.nanoTime()?
- 18. Tempo di utilizzo trascorso come asserzione nei test di unità
- 19. Come calcolare il tempo trascorso in secondi in VBA?
- 20. Come misurare il tempo totale trascorso in una funzione?
- 21. Misura il tempo trascorso tra due MotionEvents in Android
- 22. JodaTime PeriodFormat, tempo trascorso con solo 1 campo
- 23. Come determinare se è trascorso un NSDate (compreso il tempo)
- 24. Come calcolare il tempo trascorso di una funzione?
- 25. Jprofiler 7.2.2 - Come visualizzare il tempo trascorso nei metodi
- 26. `gprof` tempo trascorso in particolari righe del codice
- 27. Python - Come calcolare il tempo trascorso dalla data X?
- 28. Tempo di misurazione trascorso su GC in JVM
- 29. Calcolo del tempo trascorso in un programma C in millisecondi
- 30. Perché time.clock fornisce un tempo trascorso più lungo di time.time?
+1, Risposta buona e orientale. Grazie. :) – mAc
quindi è un valore negativo se ho capito correttamente –
@NicolasZozol puoi usare 'fabs (...)' per ottenere il valore assoluto di un float. Per esempio. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –