Hasta donde yo sé, hay al menos diez formas de medir el tiempo transcurrido:
Reloj monotónico basado:
ProcessInfo.systemUptime.
mach_absolute_timecon mach_timebase_infolo 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/ Datecomo 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:NSTimeIntervales 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:Doublees 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:Doublees 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 currentTimeMillisvs nanoTimeen 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í CFAbsoluteTimeproporciona la hora del reloj de pared en lugar de la hora de inicio. NSDatees 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.