Gunakan clock
,, ProcessInfo.systemUptime
atau DispatchTime
untuk 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_time
dengan mach_timebase_info
sebagaimana 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
/ Date
Seperti 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:NSTimeInterval
waktu 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:Double
waktu 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:Double
waktu 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 currentTimeMillis
vs nanoTime
di 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 CFAbsoluteTime
menyediakan waktu jam dinding alih-alih waktu memulai. NSDate
adalah 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.