¿Cuál es la mejor manera de obtener el tiempo actual del sistema en milisegundos?
225
[[NSDate date] timeIntervalSince1970];
Devuelve el número de segundos desde la época como un doble. Estoy casi seguro de que puede acceder a los milisegundos desde la parte fraccional.
[NSDate timeIntervalSinceReferenceDate]
es más barato. (Aunque hace referencia a una "época" diferente, si desea 1970 agregue la constanteNSTimeIntervalSince1970
.)Si está buscando usar esto para el tiempo relativo (por ejemplo, para juegos o animación) prefiero usar CACurrentMediaTime ()
Cuál es la forma recomendada;
NSDate
se basa en el reloj sincronizado en red y ocasionalmente fallará cuando se vuelva a sincronizar con la red.Devuelve el tiempo absoluto actual, en segundos.
Si solo desea la parte decimal (a menudo utilizada al sincronizar animaciones),
fuente
Comparé todas las otras respuestas en un iPhone 4S y iPad 3 (versiones de lanzamiento).
CACurrentMediaTime
tiene la menor sobrecarga por un pequeño margen.timeIntervalSince1970
es mucho más lento que los demás, probablemente debido a laNSDate
sobrecarga de instanciación, aunque puede no importar para muchos casos de uso.Recomiendo
CACurrentMediaTime
si desea la menor sobrecarga y no le importa agregar la dependencia de Quartz Framework. Ogettimeofday
si la portabilidad es una prioridad para usted.iphone 4s
Ipad 3
fuente
NSTimeIntervalSince1970
macro que es el más rápido.NSTimeIntervalSince1970
es una constante que describe los segundos entre 1970-01-01 y la "fecha de referencia" (es decir, 2001-01-01), por lo que siempre es igual a 978307200En Swift podemos hacer una función y hacer lo siguiente
Aunque funciona bien en Swift 3.0 , podemos modificar y usar la
Date
clase en lugar deNSDate
en 3.0Swift 3.0
fuente
Hasta ahora encontré
gettimeofday
una buena solución en iOS (iPad), cuando desea realizar alguna evaluación de intervalo (por ejemplo, velocidad de cuadros, tiempo de un cuadro de renderizado ...):fuente
Para obtener milisegundos para la fecha actual.
Swift 4+:
fuente
Swift 2
Swift 3
fuente
TimeInterval
akaDouble
no tiene propiedad de milisegundos.Date().timeIntervalSince1970 * 1000
Puede ser útil saber sobre CodeTimestamps, que proporcionan una envoltura alrededor de las funciones de temporización basadas en mach. Esto le brinda datos de tiempo de resolución en nanosegundos: 1000000x más precisos que milisegundos. Sí, un millón de veces más preciso. (Los prefijos son mili, micro, nano, cada uno 1000 veces más preciso que el anterior). Incluso si no necesita CodeTimestamps, consulte el código (es de código abierto) para ver cómo usan mach para obtener los datos de sincronización. Esto sería útil cuando necesite más precisión y desee una llamada a un método más rápido que el enfoque NSDate.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
fuente
-fno-objc-arc
si estás usando ARC :)fuente
Necesitaba un
NSNumber
objeto que contenga el resultado exacto de[[NSDate date] timeIntervalSince1970]
. Dado que esta función se llamó muchas veces y realmente no necesitaba crear unNSDate
objeto, el rendimiento no fue excelente.Entonces, para obtener el formato que me estaba dando la función original, intente esto:
Lo que debería darte exactamente el mismo resultado que
[[NSDate date] timeIntervalSince1970]
fuente
CFAbsoluteTimeGetCurrent ()
fuente
Prueba esto :
En este ejemplo, dateWithTimeIntervalSince1970 se usa en combinación con el formateador @ "AAAA-MM-dd HH: mm: ss.SSS" que devolverá la fecha con año, mes, día y hora con horas, minutos, segundos y milisegundos . Vea el ejemplo: "2015-12-02 04: 43: 15.008". Utilicé NSString para asegurarme de que el formato se haya escrito antes.
fuente
Esta es básicamente la misma respuesta publicada por @TristanLorach, recién recodificada para Swift 3:
fuente
}
fuente
Esto es lo que usé para Swift
usó este sitio para verificar la precisión http://currentmillis.com/
fuente
fuente
[NSDate timeIntervalSinceReferenceDate]
es otra opción, si no desea incluir el marco de Quartz. Devuelve un doble, que representa segundos.fuente
fuente