Використовуйте clock, ProcessInfo.systemUptimeабо DispatchTimeдля простого запуску часу.
Наскільки мені відомо, принаймні десять способів вимірювання минулого часу:
Монотонний годинник на основі:
ProcessInfo.systemUptime.
mach_absolute_timeіз mach_timebase_infoзазначеним у цій відповіді .
clock()в стандарті POSIX .
times()в стандарті POSIX . (Занадто складно, оскільки нам потрібно враховувати час користувач-час та системний час, а також дочірні процеси.)
DispatchTime (обгортка навколо API часу Mach), як згадував JeremyP у прийнятій відповіді.
CACurrentMediaTime().
Настінні годинники:
(ніколи не використовуйте їх для показників: див. нижче чому)
NSDate/ Dateяк згадують інші.
CFAbsoluteTime як згадують інші.
DispatchWallTime.
gettimeofday()в стандарті POSIX .
Варіант 1, 2 і 3 розроблено нижче.
Варіант 1: API інформації про процес у Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
де diff:NSTimeIntervalцей час , що минув з допомогою секунд.
Варіант 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)
}
де diff:Doubleминув час наносекунд.
Варіант 3: API годинника POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
де diff:Doubleцей час , що минув з допомогою секунд.
Чому б не настінний час за минулий час?
У документації CFAbsoluteTimeGetCurrent:
Повторні дзвінки на цю функцію не гарантують монотонно зростаючих результатів.
Причина схожа на currentTimeMillisvs nanoTimeна Java :
Ви не можете використовувати його для інших цілей. Причина в тому, що жоден годинник комп'ютера не ідеальний; вона завжди дрейфує і періодично потребує виправлення. Ця корекція може відбуватися вручну, або у випадку більшості машин є процес, який запускається і постійно видає невеликі виправлення системному годиннику ("настінний годинник"). Вони, як правило, трапляються часто. Інша така корекція відбувається, коли є високосна секунда.
Тут CFAbsoluteTimeпередбачено час настінного годинника замість часу запуску. NSDateтакож настінний годинник.
sqrt(number)замість цьогоnumber, і ви можете заощадити трохи більше часу - але є набагато більше ідей, що оптимізують пошук праймерів.