Hasta donde yo sé, hay al menos diez formas de medir el tiempo transcurrido:
Reloj monotónico basado:
ProcessInfo.systemUptime
.
mach_absolute_time
con mach_timebase_info
lo mencionado en esta respuesta .
clock()
en POSIX estándar .
times()
en POSIX estándar . (Demasiado complicado ya que necesitamos considerar el tiempo de usuario frente al tiempo del sistema, y los procesos secundarios están involucrados).
DispatchTime
(un contenedor alrededor de Mach time API) como lo menciona JeremyP en la respuesta aceptada
CACurrentMediaTime()
.
Reloj de pared basado:
(nunca los use para métricas: vea a continuación por qué)
NSDate
/ Date
como lo mencionaron otros.
CFAbsoluteTime
según lo mencionado por otros.
DispatchWallTime
.
gettimeofday()
en POSIX estándar .
Las opciones 1, 2 y 3 se detallan a continuación.
Opción 1: API de información de proceso en Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
donde diff:NSTimeInterval
es el tiempo transcurrido por segundos.
Opción 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)
}
donde diff:Double
es el tiempo transcurrido en nano-segundos.
Opción 3: API de reloj POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
donde diff:Double
es el tiempo transcurrido por segundos.
¿Por qué no la hora del reloj de pared para el tiempo transcurrido?
En la documentación de CFAbsoluteTimeGetCurrent
:
Las llamadas repetidas a esta función no garantizan resultados monotónicamente crecientes.
La razón es similar a currentTimeMillis
vs nanoTime
en Java :
No puedes usar el uno para el otro propósito. La razón es que el reloj de ninguna computadora es perfecto; siempre va a la deriva y ocasionalmente debe corregirse. Esta corrección puede ocurrir manualmente, o en el caso de la mayoría de las máquinas, hay un proceso que se ejecuta y continuamente emite pequeñas correcciones al reloj del sistema ("reloj de pared"). Estos tienden a suceder a menudo. Otra corrección de este tipo ocurre cada vez que hay un salto de segundo.
Aquí CFAbsoluteTime
proporciona la hora del reloj de pared en lugar de la hora de inicio. NSDate
es la hora del reloj de pared también.
sqrt(number)
lugar denumber
, y puede ahorrar un poco más de tiempo, pero hay muchas más ideas que optimizan la búsqueda de números primos.