เท่าที่ฉันรู้มีอย่างน้อยสิบวิธีในการวัดเวลาที่ผ่านไป:
Monotonic Clock ตาม:
ProcessInfo.systemUptime
.
mach_absolute_time
กับmach_timebase_info
ที่กล่าวไว้ในคำตอบนี้
clock()
ในมาตรฐาน POSIX
times()
ในมาตรฐาน POSIX (ซับซ้อนเกินไปเนื่องจากเราต้องพิจารณาเวลาของผู้ใช้เทียบกับเวลาของระบบและกระบวนการย่อยมีส่วนเกี่ยวข้อง)
DispatchTime
(เครื่องห่อรอบ Mach time API) ตามที่ JeremyP กล่าวไว้ในคำตอบที่ยอมรับ
CACurrentMediaTime()
.
นาฬิกาแขวนตาม:
(อย่าใช้สิ่งเหล่านี้สำหรับเมตริก: ดูเหตุผลด้านล่าง)
NSDate
/ Date
ตามที่ผู้อื่นกล่าวถึง
CFAbsoluteTime
ตามที่ผู้อื่นกล่าวถึง
DispatchWallTime
.
gettimeofday()
ในมาตรฐาน POSIX
ตัวเลือกที่ 1, 2 และ 3 มีรายละเอียดด้านล่าง
ตัวเลือกที่ 1: Process Info API ใน Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
ซึ่งdiff:NSTimeInterval
เป็นเวลาที่ผ่านไปโดยวินาที
ตัวเลือกที่ 2: Mach C API
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)
}
ซึ่งdiff:Double
เป็นเวลาที่ผ่านไปโดยนาโนวินาที
ตัวเลือกที่ 3: POSIX clock API
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
ซึ่งdiff:Double
เป็นเวลาที่ผ่านไปโดยวินาที
ทำไมไม่ใช้นาฬิกาแขวนเป็นเวลาที่ผ่านไป?
ในเอกสารของCFAbsoluteTimeGetCurrent
:
การเรียกใช้ฟังก์ชันนี้ซ้ำ ๆ ไม่ได้รับประกันผลลัพธ์ที่เพิ่มขึ้นอย่างจำเจ
เหตุผลคล้ายcurrentTimeMillis
กับnanoTime
ใน Java :
คุณไม่สามารถใช้เพื่อวัตถุประสงค์อื่นได้ เหตุผลก็คือไม่มีนาฬิกาของคอมพิวเตอร์ที่สมบูรณ์แบบ มันลอยอยู่เสมอและบางครั้งต้องได้รับการแก้ไข การแก้ไขนี้อาจเกิดขึ้นด้วยตนเองหรือในกรณีของเครื่องส่วนใหญ่มีกระบวนการที่ทำงานและออกการแก้ไขเล็กน้อยอย่างต่อเนื่องกับนาฬิการะบบ ("นาฬิกาแขวน") สิ่งเหล่านี้มักจะเกิดขึ้นบ่อยครั้ง การแก้ไขเช่นนี้เกิดขึ้นเมื่อใดก็ตามที่มีวินาทีอธิกสุรทิน
ที่นี่CFAbsoluteTime
ให้เวลานาฬิกาแขวนแทนเวลาเริ่มต้น NSDate
เป็นเวลานาฬิกาแขวนเช่นกัน
sqrt(number)
แทนnumber
และคุณสามารถประหยัดเวลาได้อีกเล็กน้อย แต่ยังมีแนวคิดอีกมากมายในการเพิ่มประสิทธิภาพการค้นหาช่วงเวลา