Jaki jest najlepszy sposób, aby uzyskać bieżące milisekundy czasu systemowego?
225
[[NSDate date] timeIntervalSince1970];
Zwraca liczbę sekund od epoki jako podwójną. Jestem prawie pewien, że możesz uzyskać dostęp do milisekund z części ułamkowej.
[NSDate timeIntervalSinceReferenceDate]
jest tańsze. (Chociaż odnosi się do innej „epoki” - jeśli chcesz, aby 1970 dodała stałąNSTimeIntervalSince1970
.)Jeśli chcesz użyć tego do względnego pomiaru czasu (na przykład do gier lub animacji), wolę użyć CACurrentMediaTime ()
Który jest zalecanym sposobem;
NSDate
czerpie z sieciowego zegara synchronizacji i od czasu do czasu czkawka przy ponownej synchronizacji z siecią.Zwraca bieżący czas bezwzględny w sekundach.
Jeśli chcesz tylko część dziesiętną (często używaną podczas synchronizacji animacji),
źródło
Testowałem wszystkie pozostałe odpowiedzi na iPhonie 4S i iPadzie 3 (wersje kompilacji).
CACurrentMediaTime
ma najmniejszy narzut przy niewielkim marginesie.timeIntervalSince1970
jest znacznie wolniejszy niż inne, prawdopodobnie z powoduNSDate
narzutu tworzenia instancji, chociaż może nie mieć znaczenia w wielu przypadkach użycia.Polecam,
CACurrentMediaTime
jeśli chcesz jak najmniej narzutu i nie przeszkadza dodanie zależności Quartz Framework. Lubgettimeofday
jeśli przenośność jest dla Ciebie priorytetem.iPhone 4S
iPad 3
źródło
NSTimeIntervalSince1970
makro, które jest najszybsze.NSTimeIntervalSince1970
to stała opisująca sekundy między 1970-01-01 a „datą odniesienia” (tj. 2001-01-01), więc zawsze jest równa 978307200W Swift możemy wykonać funkcję i wykonać następujące czynności
Chociaż działa dobrze w Swift 3.0, ale możemy zmodyfikować i użyć tej
Date
klasy zamiastNSDate
w 3.0Swift 3.0
źródło
Do tej pory znalazłem
gettimeofday
dobre rozwiązanie na iOS (iPad), kiedy chcesz przeprowadzić ocenę interwału (powiedzmy, ilość klatek na sekundę, czas wyświetlania ramki renderowania ...):źródło
Aby uzyskać milisekundy dla bieżącej daty.
Swift 4+:
źródło
Swift 2
Szybki 3
źródło
TimeInterval
akaDouble
nie ma właściwości milisekund.Date().timeIntervalSince1970 * 1000
Warto wiedzieć o CodeTimestamps, które zapewniają owijanie wokół funkcji czasowych opartych na machu. To daje dane czasowe o rozdzielczości nanosekundowej - 1000000x bardziej precyzyjne niż milisekundy. Tak, milion razy bardziej precyzyjnie. (Prefiksy to milli, micro, nano, każdy 1000 razy bardziej precyzyjny niż ostatni.) Nawet jeśli nie potrzebujesz CodeTimestamps, sprawdź kod (jest to oprogramowanie typu open source), aby zobaczyć, w jaki sposób używają mach, aby uzyskać dane o taktowaniu. Byłoby to przydatne, gdy potrzebujesz większej precyzji i chcesz szybszego wywołania metody niż podejście NSDate.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
źródło
-fno-objc-arc
jeśli używasz ARC :)źródło
Potrzebowałem
NSNumber
obiektu zawierającego dokładny wynik[[NSDate date] timeIntervalSince1970]
. Ponieważ ta funkcja była wywoływana wiele razy i tak naprawdę nie musiałem tworzyćNSDate
obiektu, wydajność nie była świetna.Aby uzyskać format, który dawała mi oryginalna funkcja, spróbuj tego:
Co powinno dać ci dokładnie taki sam wynik jak
[[NSDate date] timeIntervalSince1970]
źródło
CFAbsoluteTimeGetCurrent ()
źródło
Spróbuj tego :
W tym przykładzie dateWithTimeIntervalSince1970 jest używany w połączeniu z formatyzatorem @ „RRRR-MM-dd GG: mm: ss.SSS”, który zwraca datę z rokiem, miesiącem, dniem i godziną z godzinami, minutami, sekundami i milisekundami . Zobacz przykład: „2015-12-02 04: 43: 15.008”. Użyłem NSString, aby mieć pewność, że format zostanie wcześniej zapisany.
źródło
Jest to w zasadzie ta sama odpowiedź, którą opublikował @TristanLorach, właśnie przerobiony dla Swift 3:
źródło
}
źródło
Tego właśnie użyłem w Swift
używał tej strony do weryfikacji dokładności http://currentmillis.com/
źródło
źródło
[NSDate timeIntervalSinceReferenceDate]
to kolejna opcja, jeśli nie chcesz uwzględniać ramy Quartz. Zwraca podwójny, reprezentujący sekundy.źródło
źródło