O ile wiem, istnieje co najmniej dziesięć sposobów mierzenia upływającego czasu:
Na podstawie zegara monotonicznego:
ProcessInfo.systemUptime
.
mach_absolute_time
z mach_timebase_info
jak wspomniano w tej odpowiedzi .
clock()
w standardzie POSIX .
times()
w standardzie POSIX . (Zbyt skomplikowane, ponieważ musimy rozważyć czas użytkownika w porównaniu z czasem systemowym, a procesy potomne są zaangażowane).
DispatchTime
(wrapper wokół Mach time API), jak wspomniał JeremyP w zaakceptowanej odpowiedzi.
CACurrentMediaTime()
.
Na podstawie zegara ściennego:
(nigdy nie używaj ich do pomiarów: zobacz poniżej, dlaczego)
NSDate
/ Date
jak wspominali inni.
CFAbsoluteTime
jak wspominali inni.
DispatchWallTime
.
gettimeofday()
w standardzie POSIX .
Opcje 1, 2 i 3 omówiono poniżej.
Opcja 1: Process Info API w Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
gdzie diff:NSTimeInterval
jest upływający czas w sekundach.
Opcja 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)
}
gdzie diff:Double
jest upływający czas o nano-sekundy.
Opcja 3: API zegara POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
gdzie diff:Double
jest upływający czas w sekundach.
Dlaczego nie czas na zegarze ściennym dla upływającego czasu?
W dokumentacji CFAbsoluteTimeGetCurrent
:
Wielokrotne wywołania tej funkcji nie gwarantują monotonnie rosnących wyników.
Powód jest podobny do currentTimeMillis
vs nanoTime
w Javie :
Nie możesz użyć tego w innym celu. Powodem jest to, że żaden zegar komputera nie jest doskonały; zawsze dryfuje i od czasu do czasu wymaga korekty. Ta korekta może nastąpić ręcznie lub w przypadku większości komputerów działa proces, który nieustannie wprowadza niewielkie poprawki do zegara systemowego („zegar ścienny”). To zdarza się często. Kolejna taka korekta ma miejsce, gdy pojawia się sekunda przestępna.
Tutaj CFAbsoluteTime
podaje czas zegara ściennego zamiast czasu uruchomienia. NSDate
to również zegar ścienny.
sqrt(number)
zamiastnumber
i możesz zaoszczędzić trochę więcej czasu - ale jest o wiele więcej pomysłów optymalizujących wyszukiwanie liczb pierwszych.