Використовуйте 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
:
Повторні дзвінки на цю функцію не гарантують монотонно зростаючих результатів.
Причина схожа на currentTimeMillis
vs nanoTime
на Java :
Ви не можете використовувати його для інших цілей. Причина в тому, що жоден годинник комп'ютера не ідеальний; вона завжди дрейфує і періодично потребує виправлення. Ця корекція може відбуватися вручну, або у випадку більшості машин є процес, який запускається і постійно видає невеликі виправлення системному годиннику ("настінний годинник"). Вони, як правило, трапляються часто. Інша така корекція відбувається, коли є високосна секунда.
Тут CFAbsoluteTime
передбачено час настінного годинника замість часу запуску. NSDate
також настінний годинник.
sqrt(number)
замість цьогоnumber
, і ви можете заощадити трохи більше часу - але є набагато більше ідей, що оптимізують пошук праймерів.