Apa cara terbaik untuk mendapatkan milidetik waktu sistem saat ini?
225
[[NSDate date] timeIntervalSince1970];
Ia mengembalikan jumlah detik sejak zaman sebagai dobel. Saya hampir yakin Anda dapat mengakses milidetik dari bagian fraksional.
[NSDate timeIntervalSinceReferenceDate]
lebih murah. (Meskipun mengacu pada "zaman" yang berbeda - jika Anda ingin tahun 1970 tambahkan konstantaNSTimeIntervalSince1970
.)Jika Anda ingin menggunakan ini untuk waktu relatif (misalnya untuk game atau animasi) Saya lebih suka menggunakan CACurrentMediaTime ()
Yang merupakan cara yang disarankan;
NSDate
menarik dari jam sinkronisasi jaringan dan kadang-kadang akan tersendat saat menyinkronkannya kembali ke jaringan.Ini mengembalikan waktu absolut saat ini, dalam detik.
Jika Anda hanya menginginkan bagian desimal (sering digunakan saat menyinkronkan animasi),
sumber
Saya membandingkan semua jawaban lain pada iPhone 4S dan iPad 3 (rilis rilis).
CACurrentMediaTime
memiliki overhead paling kecil dengan selisih kecil.timeIntervalSince1970
jauh lebih lambat daripada yang lain, mungkin karenaNSDate
overhead instantiation, meskipun mungkin tidak masalah untuk banyak kasus penggunaan.Saya akan merekomendasikan
CACurrentMediaTime
jika Anda ingin overhead paling sedikit dan tidak keberatan menambahkan dependensi Quartz Framework. Ataugettimeofday
jika portabilitas adalah prioritas bagi Anda.iPhone 4S
iPad 3
sumber
NSTimeIntervalSince1970
makro yang merupakan yang tercepat.NSTimeIntervalSince1970
adalah konstanta yang menggambarkan detik antara 1970-01-01 dan "tanggal referensi" (yaitu 2001-01-01), jadi selalu sama dengan 978307200Di Swift kita dapat membuat fungsi dan melakukan hal berikut
Meskipun ini berfungsi dengan baik di Swift 3.0 tetapi kita dapat memodifikasi dan menggunakan
Date
kelas daripadaNSDate
di 3.0Swift 3.0
sumber
Sejauh ini saya menemukan
gettimeofday
solusi yang bagus di iOS (iPad), ketika Anda ingin melakukan evaluasi interval (misalnya, framerate, waktu bingkai render ...):sumber
Untuk mendapatkan milidetik untuk tanggal saat ini.
Swift 4+:
sumber
Cepat 2
Cepat 3
sumber
TimeInterval
aliasDouble
tidak memiliki properti milidetik.Date().timeIntervalSince1970 * 1000
Mungkin bermanfaat untuk mengetahui tentang CodeTimestamps, yang menyediakan pembungkus seputar fungsi pengaturan waktu berbasis mesin. Ini memberi Anda data timing resolusi nanosecond - 1000000x lebih tepat daripada milidetik. Ya, sejuta kali lebih tepat. (Awalannya adalah mili, mikro, nano, masing-masing 1000x lebih tepat daripada yang terakhir.) Bahkan jika Anda tidak memerlukan CodeTimestamps, periksa kode (itu open source) untuk melihat bagaimana mereka menggunakan mach untuk mendapatkan data waktu. Ini akan berguna ketika Anda membutuhkan lebih banyak presisi dan menginginkan pemanggilan metode yang lebih cepat daripada pendekatan NSDate.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
sumber
-fno-objc-arc
jika Anda menggunakan ARC :)sumber
Saya membutuhkan
NSNumber
objek yang berisi hasil persis[[NSDate date] timeIntervalSince1970]
. Karena fungsi ini dipanggil berkali-kali dan saya tidak benar-benar perlu membuatNSDate
objek, kinerjanya tidak bagus.Jadi untuk mendapatkan format yang diberikan fungsi asli kepada saya, coba ini:
Yang seharusnya memberi Anda hasil yang sama persis seperti
[[NSDate date] timeIntervalSince1970]
sumber
CFAbsoluteTimeGetCurrent ()
sumber
Coba ini :
Dalam contoh ini, dateWithTimeIntervalSince1970 digunakan dalam kombinasi formatter @ "YYYY-MM-dd HH: mm: ss.SSS" yang akan mengembalikan tanggal dengan tahun, bulan, hari dan waktu dengan jam, menit, detik, dan milidetik . Lihat contoh: "2015-12-02 04: 43: 15.008". Saya menggunakan NSString untuk memastikan bahwa format akan ditulis sebelumnya.
sumber
Ini pada dasarnya jawaban yang sama seperti yang diposting oleh @TristanLorach, baru saja dikodekan ulang untuk Swift 3:
sumber
}
sumber
Inilah yang saya gunakan untuk Swift
menggunakan situs ini untuk memverifikasi akurasi http://currentmillis.com/
sumber
sumber
[NSDate timeIntervalSinceReferenceDate]
adalah pilihan lain, jika Anda tidak ingin menyertakan kerangka kerja Quartz. Ini mengembalikan ganda, mewakili detik.sumber
sumber