2016-12-15 11 views
1

私はDispatchTime.now()を使用してイベント間の経過時間を測定しています。ときには正しく動作することもありますが、時には、私が期待する値よりはるかに低い値を生成することがあります。Swift 3.0のDispatchTime.now()が不正確

私の現在の使用:

TおよびPTが経過し、現在および以前の時間であるよう
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 

はナノ秒の差をとり、doubleに変換し、スケールように1秒= 32768この技術は失敗します記録されたデータは予想されるよりも約100倍小さい。スケーリングは問題ではない、私はtとptのrawValueをチェックした。私の前提は、DispatchTimeを実行するクロックがデバッグのために遅い速度で実行されていることですが、一般的にはiOSがこのようなものを補うと思うでしょう。

+1

:として

が実装されています。これは、OSによって行われるタイマー統合など、壁(「通常」)時間からのあらゆる種類の偏差の影響を受けます。 – Alexander

+0

ありがとうアレクサンダー。あなたはディスパッチの意味を指定できますか?私はDispatchTimeを使用している人の例を見ましたが、それはきれいに見えましたが、それは最良の選択ではないと思います。実際の経過時間を測定するための推奨事項はありますか? – jonwooding

+1

Grand Central Dispatchは、Swiftのマルチスレッドフレームワークです。 'DispatchTime'を' Dispatch'ジョブの時間指定以外のものに使うのは完全に不適切であり、このような厄介な結果につながります。ここでの私の解決策は、正確に何を求めているのか、私が望む精度、それに対して支払うことができるパフォーマンスの量などに依存します。 – Alexander

答えて

0

@AlexanderMomchliovは、NSDateがDispatchTimeより優れたアプローチであることを提案しました。 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 
関連する問題