Pour autant que je sache, il existe au moins dix façons de mesurer le temps écoulé:
Basé sur l'horloge monotone:
ProcessInfo.systemUptime
.
mach_absolute_time
avec mach_timebase_info
comme mentionné dans cette réponse .
clock()
au standard POSIX .
times()
au standard POSIX . (Trop compliqué car nous devons considérer le temps utilisateur par rapport au temps système, et les processus enfants sont impliqués.)
DispatchTime
(un wrapper autour de l'API Mach time) comme mentionné par JeremyP dans la réponse acceptée.
CACurrentMediaTime()
.
Horloge murale basée:
(ne les utilisez jamais pour les métriques: voyez ci-dessous pourquoi)
NSDate
/ Date
comme mentionné par d'autres.
CFAbsoluteTime
comme mentionné par d'autres.
DispatchWallTime
.
gettimeofday()
au standard POSIX .
Les options 1, 2 et 3 sont développées ci-dessous.
Option 1: API Process Info dans Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
où diff:NSTimeInterval
est le temps écoulé en secondes.
Option 2: API Mach C
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)
}
où diff:Double
est le temps écoulé en nano-secondes.
Option 3: API d'horloge POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
où diff:Double
est le temps écoulé en secondes.
Pourquoi pas le temps de l'horloge murale pour le temps écoulé?
Dans la documentation de CFAbsoluteTimeGetCurrent
:
Les appels répétés à cette fonction ne garantissent pas des résultats à augmentation monotone.
La raison est similaire à currentTimeMillis
vs nanoTime
en Java :
Vous ne pouvez pas utiliser l'un dans l'autre but. La raison en est qu'aucune horloge d'ordinateur n'est parfaite; il dérive toujours et doit parfois être corrigé. Cette correction peut être effectuée manuellement ou, dans le cas de la plupart des machines, il existe un processus qui s'exécute et émet continuellement de petites corrections à l'horloge système ("horloge murale"). Celles-ci ont tendance à se produire souvent. Une autre correction de ce type se produit chaque fois qu'il y a une seconde intercalaire.
Ici CFAbsoluteTime
fournit l'heure de l'horloge murale au lieu de l'heure de démarrage. NSDate
est également l'heure de l'horloge murale.
sqrt(number)
lieu denumber
, et vous pouvez gagner un peu plus de temps - mais il y a beaucoup plus d'idées pour optimiser la recherche de nombres premiers.