Até onde eu sei, existem pelo menos dez maneiras de medir o tempo decorrido:
Relógio monotônico baseado:
ProcessInfo.systemUptime.
mach_absolute_timecom mach_timebase_infocomo mencionado nesta resposta .
clock()no padrão POSIX .
times()no padrão POSIX . (Muito complicado, pois precisamos considerar o tempo do usuário versus o tempo do sistema, e os processos filhos estão envolvidos.)
DispatchTime (um invólucro em torno da API do horário do Mach), conforme mencionado por JeremyP na resposta aceita.
CACurrentMediaTime().
Relógio de parede baseado:
(nunca use esses para métricas: veja abaixo o porquê)
NSDate/ Datecomo mencionado por outros.
CFAbsoluteTime como mencionado por outros.
DispatchWallTime.
gettimeofday()no padrão POSIX .
As opções 1, 2 e 3 são elaboradas abaixo.
Opção 1: API de informações do processo no Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
onde diff:NSTimeIntervalé o tempo decorrido em segundos.
Opção 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)
}
onde diff:Doubleé o tempo decorrido em nanossegundos.
Opção 3: API do relógio POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
onde diff:Doubleé o tempo decorrido em segundos.
Por que não o tempo do relógio de parede pelo tempo decorrido?
Na documentação de CFAbsoluteTimeGetCurrent:
Chamadas repetidas para esta função não garantem resultados crescentes monotonicamente.
O motivo é semelhante ao currentTimeMillisvs nanoTimeem Java :
Você não pode usar esse para o outro propósito. A razão é que o relógio do computador não é perfeito; sempre deriva e, ocasionalmente, precisa ser corrigido. Essa correção pode ocorrer manualmente ou, no caso da maioria das máquinas, existe um processo que executa e emite continuamente pequenas correções no relógio do sistema ("relógio de parede"). Estes tendem a acontecer frequentemente. Outra correção desse tipo ocorre sempre que há um salto de segundo.
Aqui CFAbsoluteTimefornece a hora do relógio de parede em vez da hora de inicialização. NSDateé a hora do relógio de parede também.
sqrt(number)vez denumbere você pode economizar um pouco mais de tempo - mas há muito mais idéias para otimizar a busca por números primos.