2016-12-15 80 views
1

我使用DispatchTime.now()来测量事件之间的已用时间。有时它可以正常工作,但偶尔它会产生远低于我预期的值。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 

使得吨和Pt当前和以前的时间,经过的发生在纳秒的差,转换为加倍和体重秤如1秒= 32768。当这种技术无法记录的数据比预期的小约100倍。缩放不是问题,我已经检查了t和pt的rawValue。我的假设是,运行DispatchTime的时钟运行速度较慢,可能是因为调试,但总的来说,我认为iOS会补偿这样的事情。

+1

DispatchTime是为...调度。它受到各种与墙(“常规”)时间的偏差的影响,例如由OS完成的定时器合并。 – Alexander

+0

谢谢亚历山大。你能指定你的意思吗?我看到有人使用DispatchTime的例子,它看起来很干净,但我认为这不是最好的选择。你有建议测量真实时间? – jonwooding

+1

Grand Central Dispatch是Swift的多线程框架。除了指定'Dispatch'作业的时间以外,使用'DispatchTime'完全不合适,并且会导致这样的结果。我的解决方案取决于我想要做什么,我想要的精度类型,我愿意为它支付的性能数量等。 – Alexander

回答

0

由于@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