[英]Inaccurate DispatchTime.now() in Swift 3.0
我正在使用 DispatchTime.now() 來測量事件之間經過的時間。 有時它可以正常工作,但有時它會生成遠低於我預期的值。
我目前的使用情況:
var t = DispatchTime.now()
var pt = DispatchTime.now()
// called when an event happens
t = DispatchTime.now()
var elapsed = Double(t.uptimeNanoseconds - pt.uptimeNanoseconds)
elapsed *= 32768/1000000000
pt = t
這樣 t 和 pt 是當前和以前的時間,經過的時間以納秒為單位,轉換為雙倍,並進行縮放,使 1 秒 = 32768。當此技術失敗時,記錄的數據比預期的要小約 100 倍。 縮放不是問題,我檢查了 t 和 pt 的 rawValue。 我的假設是運行 DispatchTime 的時鍾運行速度較慢,可能是因為調試,但總的來說,我認為 iOS 會補償這樣的事情。
正如@AlexanderMomchliov 所建議的,NSDate 是比 DispatchTime 更好的方法。
實現為:
var t: TimeInterval = 0
var pt: TimeInterval = NSDate().timeIntervalSinceReferenceDate
// called when an event happens
t = NSDate().timeIntervalSinceReferenceDate
var elapsed: Double = t - pt
elapsed *= 32768
pt = t
您正在執行整數除法,這將導致經過的時間不准確:
elapsed *= 32768/1000000000
您應該將它們包裝為Double
或以小數結尾(即32768.0/1000000000.0
):
elapsed *= Double(32768)/Double(1000000000)
此外, NSEC_PER_SEC
被定義為全局變量,作為調度框架的一部分:
elapsed *= Double(32768)/Double(NSEC_PER_SEC)
NSDate
或Date
可能由系統調整,不應用於可靠地測量經過的時間。 DispatchTime
或CACurrentMediaTime
將是很好的解決方案,並且都基於馬赫絕對時間。 但是,如果應用程序在測量過程中被置於后台,那么使用Date
將是一個很好的后備。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.