2010-09-09 10 views
13

Ho bisogno di cronometrare alcuni eventi nell'app a cui sto lavorando. In Java ero in grado di chiamare currentTimeMillis() ma non sembra esserci una versione in Objective-c. C'è un modo per controllare l'ora corrente senza creare un NSDate e quindi analizzare questo oggetto ogni volta che ho bisogno di queste informazioni?Esiste una versione dell'obiettivo-c/iPhone di currentTimeMillis() da Java?

Grazie -Code

risposta

11

C'è anche CFAbsoluteTimeGetCurrent(), che ti darà il tempo in secondi di precisione doppia.

7

Per ottenere molto a buon mercato tempo molto preciso, è possibile utilizzare gettimeofday(), che è una funzione C del kernel BSD. Si prega di leggere la pagina man per tutti i dettagli, ma ecco un esempio semplice:

struct timeval t; 
gettimeofday(&t, NULL); 

long msec = t.tv_sec * 1000 + t.tv_usec/1000; 
+0

Questo è più economico di "[[Data NSDate] timeIntervalSince1970] * 1000'. Restituisce l'intervallo da mezzanotte (0 ore) 1/1/1970. Dovresti usare 'gettimeofday (& t, NULL);' se il tuo codice viene chiamato molto spesso come loop di aggiornamento sul gioco. Si dovrebbe usare un tipo di dati lungo per questo grande valore: 'long long millis = t.tv_sec * 1000 + t.tv_usec/1000;' – hieund

2

Invece gettimeofday() si potrebbe anche usare [NSDate timeIntervalSinceReferenceDate] (il metodo della classe) e fare i vostri calcoli con quello. Ma hanno lo stesso problema: operano su "wall clock time". Ciò significa che la misurazione può essere disattivata se vengono aggiunti secondi intercalari mentre il test è in esecuzione o alla transizione tra l'ora legale.

È possibile utilizzare la chiamata di sistema Mach mach_absolute_time() su OS X e iOS. Con le informazioni restituite da mach_timebase_info() questo può essere convertito in nanosecondi.

8

[[NSDate date] timeIntervalSince1970] * 1000 restituisce un lo stesso valore di currentTimeMillis()

CFAbsoluteTimeGetCurrent() e [NSDate timeIntervalSinceReferenceDate] sia restituiscono una doppia a partire da 1 Gen 2001 00:00:00 GMT.

+1

Non proprio. 'timeIntervalSince1970' restituisce il tempo in secondi, mentre il nome' currentTimeMillis() 'implica che restituisca millisecondi. – Sven

+0

@Sven: molto vero, ho appena modificato la mia risposta. Grazie – tidwall

0

La risposta corretta è [[Data NSDate] timeIntervalSince1970]; questo ti darà il timestamp attuale in millisecondi.

La risposta data da @Noah Witherspoon restituisce la data corrente ma l'anno non è l'anno di abbinamento corrente.

Problemi correlati