簡體   English   中英

Swift 3.0 中的 DispatchTime.now() 不准確

[英]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)

NSDateDate可能由系統調整,不應用於可靠地測量經過的時間。 DispatchTimeCACurrentMediaTime將是很好的解決方案,並且都基於馬赫絕對時間。 但是,如果應用程序在測量過程中被置於后台,那么使用Date將是一個很好的后備。

還建議查看此問題以進行進一步討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM