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_timeavec mach_timebase_infocomme 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/ Datecomme 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:NSTimeIntervalest 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:Doubleest 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:Doubleest 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 à currentTimeMillisvs nanoTimeen 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 CFAbsoluteTimefournit l'heure de l'horloge murale au lieu de l'heure de démarrage. NSDateest é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.