Используйте clock
, ProcessInfo.systemUptime
или DispatchTime
для простого времени запуска.
Насколько мне известно, существует как минимум десять способов измерить прошедшее время:
Монотонные часы на основе:
ProcessInfo.systemUptime
,
mach_absolute_time
с , mach_timebase_info
как указано в этом ответе .
clock()
в стандарте POSIX .
times()
в стандарте POSIX . (Слишком сложно, поскольку нам нужно учитывать время пользователя и время системы, а также задействованы дочерние процессы.)
DispatchTime
(оболочка вокруг API времени Маха), как упоминалось 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: Mach C API
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
, и вы можете сэкономить немного больше времени, но есть гораздо больше идей по оптимизации поиска простых чисел.