Gunakan clock,, ProcessInfo.systemUptimeatau DispatchTimeuntuk waktu mulai yang sederhana.
Sejauh yang saya tahu, setidaknya ada sepuluh cara untuk mengukur waktu yang telah berlalu:
Berbasis Jam Monoton:
ProcessInfo.systemUptime.
mach_absolute_timedengan mach_timebase_infosebagaimana disebutkan dalam jawaban ini .
clock()dalam standar POSIX .
times()dalam standar POSIX . (Terlalu rumit karena kita perlu mempertimbangkan waktu pengguna vs waktu sistem, dan proses anak terlibat.)
DispatchTime (pembungkus sekitar API waktu Mach) sebagaimana disebutkan oleh JeremyP dalam jawaban yang diterima.
CACurrentMediaTime().
Berbasis Jam Dinding:
(jangan pernah gunakan itu untuk metrik: lihat alasannya di bawah)
NSDate/ DateSeperti yang disebutkan oleh orang lain.
CFAbsoluteTime seperti yang disebutkan oleh orang lain.
DispatchWallTime.
gettimeofday()dalam standar POSIX .
Opsi 1, 2 dan 3 diuraikan di bawah ini.
Opsi 1: API Info Proses dalam Yayasan
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
di mana diff:NSTimeIntervalwaktu yang berlalu oleh detik.
Opsi 2: API Mach C
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)
}
di mana diff:Doublewaktu yang berlalu oleh nano-detik.
Opsi 3: API jam POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
di mana diff:Doublewaktu yang berlalu oleh detik.
Mengapa Bukan Jam Dinding untuk Masa Berlalu?
Dalam dokumentasi CFAbsoluteTimeGetCurrent:
Panggilan berulang ke fungsi ini tidak menjamin hasil yang meningkat secara monoton.
Alasannya mirip dengan currentTimeMillisvs nanoTimedi Jawa :
Anda tidak dapat menggunakan yang satu untuk tujuan yang lain. Alasannya adalah tidak ada jam komputer yang sempurna; selalu melayang dan kadang-kadang perlu diperbaiki. Koreksi ini dapat terjadi secara manual, atau dalam kasus kebanyakan mesin, ada proses yang berjalan dan terus-menerus mengeluarkan koreksi kecil pada jam sistem ("jam dinding"). Ini cenderung sering terjadi. Koreksi lain seperti itu terjadi setiap kali ada lompatan kedua.
Di sini CFAbsoluteTimemenyediakan waktu jam dinding alih-alih waktu memulai. NSDateadalah waktu jam dinding juga.
sqrt(number)bukannumber, dan Anda dapat menyimpan waktu yang lebih sedikit - tetapi ada banyak lagi ide-ide mengoptimalkan mencari bilangan prima.