Per quanto ne so, esistono almeno dieci modi per misurare il tempo trascorso:
Basato su orologio monotonico:
ProcessInfo.systemUptime
.
mach_absolute_time
con mach_timebase_info
come menzionato in questa risposta .
clock()
nello standard POSIX .
times()
nello standard POSIX . (Troppo complicato poiché dobbiamo considerare il tempo dell'utente rispetto al tempo di sistema e sono coinvolti i processi figlio.)
DispatchTime
(un wrapper attorno all'API di Mach Time) come indicato da JeremyP nella risposta accettata.
CACurrentMediaTime()
.
Basato su orologio da parete:
(non usare mai quelli per le metriche: vedi sotto perché)
NSDate
/ Date
come menzionato da altri.
CFAbsoluteTime
come menzionato da altri.
DispatchWallTime
.
gettimeofday()
nello standard POSIX .
Le opzioni 1, 2 e 3 sono elaborate di seguito.
Opzione 1: API delle informazioni di processo in Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
dove diff:NSTimeInterval
è il tempo trascorso in secondi.
Opzione 2: Mach C API
do {
var info = mach_timebase_info(numer: 0, denom: 0)
mach_timebase_info(&info)
let begin = mach_absolute_time()
// do something
let diff = Double(mach_absolute_time() - begin) * Double(info.numer) / Double(info.denom)
}
dove diff:Double
è il tempo trascorso di nano-secondi.
Opzione 3: API dell'orologio POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
dove diff:Double
è il tempo trascorso in secondi.
Perché non l'ora dell'orologio da parete per il tempo trascorso?
Nella documentazione di CFAbsoluteTimeGetCurrent
:
Le chiamate ripetute a questa funzione non garantiscono risultati monotonicamente crescenti.
Il motivo è simile a currentTimeMillis
vs nanoTime
in Java :
Non puoi usare l'uno per l'altro scopo. Il motivo è che nessun orologio da computer è perfetto; va sempre alla deriva e occasionalmente deve essere corretto. Questa correzione può avvenire manualmente o, nel caso della maggior parte delle macchine, esiste un processo che viene eseguito e genera continuamente piccole correzioni all'orologio di sistema ("orologio da parete"). Questi tendono ad accadere spesso. Un'altra correzione di questo tipo si verifica ogni volta che c'è un secondo di salto.
Qui CFAbsoluteTime
fornisce l'ora dell'orologio da parete anziché l'ora di avvio. NSDate
è anche l'ora dell'orologio da parete.
sqrt(number)
invece dinumber
, e puoi risparmiare un po 'più di tempo - ma ci sono molte più idee che ottimizzano la ricerca di numeri primi.