O ile wiem, istnieje co najmniej dziesięć sposobów mierzenia upływającego czasu:
Na podstawie zegara monotonicznego:
ProcessInfo.systemUptime.
mach_absolute_timez mach_timebase_infojak 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/ Datejak 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:NSTimeIntervaljest 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:Doublejest 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:Doublejest 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 currentTimeMillisvs nanoTimew 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 CFAbsoluteTimepodaje czas zegara ściennego zamiast czasu uruchomienia. NSDateto również zegar ścienny.
sqrt(number)zamiastnumberi możesz zaoszczędzić trochę więcej czasu - ale jest o wiele więcej pomysłów optymalizujących wyszukiwanie liczb pierwszych.