Qual é a melhor maneira de obter o tempo atual do sistema em milissegundos?
225
[[NSDate date] timeIntervalSince1970];
Retorna o número de segundos desde a época como um dobro. Tenho quase certeza de que você pode acessar os milissegundos da parte fracionária.
[NSDate timeIntervalSinceReferenceDate]
é mais barato. (Embora ele faz referência a uma "época" diferente - se você quiser 1970 adicionar a constanteNSTimeIntervalSince1970
.)Se você estiver usando isso para um tempo relativo (por exemplo, para jogos ou animação), prefiro usar CACurrentMediaTime ()
Qual é o caminho recomendado;
NSDate
extrai do relógio de sincronização em rede e ocasionalmente soluça ao sincronizá-lo novamente com a rede.Retorna o tempo absoluto atual, em segundos.
Se você deseja apenas a parte decimal (geralmente usada ao sincronizar animações),
fonte
Comparei todas as outras respostas em um iPhone 4S e iPad 3 (compilações de versão).
CACurrentMediaTime
tem o mínimo de sobrecarga por uma pequena margem.timeIntervalSince1970
é muito mais lento que os outros, provavelmente devido àNSDate
sobrecarga da instanciação, embora possa não ser importante para muitos casos de uso.Eu recomendo
CACurrentMediaTime
se você deseja o mínimo de sobrecarga e não se importa de adicionar a dependência do Quartz Framework. Ougettimeofday
se a portabilidade é uma prioridade para você.iPhone 4S
iPad 3
fonte
NSTimeIntervalSince1970
macro que é o mais rápido.NSTimeIntervalSince1970
é uma constante que descreve os segundos entre 01-01-2009 e a "data de referência" (ou seja, 01-01-2001), portanto é sempre igual a 978307200Em Swift, podemos criar uma função e fazer o seguinte
Apesar de seu bom trabalho em Swift 3.0 , mas podemos modificar e usar a
Date
classe em vez deNSDate
em 3.0Swift 3.0
fonte
Até agora, encontrei
gettimeofday
uma boa solução no iOS (iPad), quando você deseja realizar alguma avaliação de intervalo (por exemplo, taxa de quadros, tempo de um quadro de renderização ...):fonte
Para obter milissegundos para a data atual.
Swift 4+:
fonte
Swift 2
Swift 3
fonte
TimeInterval
akaDouble
não tem propriedade em milissegundos.Date().timeIntervalSince1970 * 1000
Pode ser útil conhecer os CodeTimestamps, que fornecem um invólucro para as funções de temporização baseadas em mach. Isso fornece dados de tempo de resolução em nanossegundos - 1000000x mais preciso que milissegundos. Sim, um milhão de vezes mais preciso. (Os prefixos são milli, micro, nano, cada 1000x mais preciso que o anterior.) Mesmo se você não precisar dos carimbos de data e hora do CodeTim, verifique o código (é de código aberto) para ver como eles usam mach para obter os dados de tempo. Isso seria útil quando você precisar de mais precisão e desejar uma chamada de método mais rápida que a abordagem NSDate.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
fonte
-fno-objc-arc
se você estiver usando ARC :)fonte
Eu precisava de um
NSNumber
objeto contendo o resultado exato de[[NSDate date] timeIntervalSince1970]
. Como essa função foi chamada várias vezes e eu realmente não precisava criar umNSDate
objeto, o desempenho não foi ótimo.Portanto, para obter o formato que a função original estava fornecendo, tente o seguinte:
O que deve fornecer exatamente o mesmo resultado que
[[NSDate date] timeIntervalSince1970]
fonte
CFAbsoluteTimeGetCurrent ()
fonte
Tente o seguinte:
Neste exemplo, dateWithTimeIntervalSince1970 é usado em combinação com o formatador "AAAA-MM-dd HH: mm: ss.SSS" que retornará a data com ano, mês, dia e hora com horas, minutos, segundos e milissegundos . Veja o exemplo: "02-12-2015 04: 43: 15.008". Eu usei o NSString para ter certeza de que o formato será escrito anteriormente.
fonte
Esta é basicamente a mesma resposta postada por @TristanLorach, recodificada para o Swift 3:
fonte
}
fonte
Isto é o que eu usei para Swift
usou este site para verificar a precisão http://currentmillis.com/
fonte
fonte
[NSDate timeIntervalSinceReferenceDate]
é outra opção, se você não deseja incluir a estrutura Quartz. Retorna um duplo, representando segundos.fonte
fonte