如何获得精确的时间,例如在Objective-C中以毫秒为单位?

有没有一种简单的方法可以精确地获取时间?


我需要计算两次方法调用之间的延迟。更具体地说,我想计算UIScrollView中的滚动速度。


九州编程
浏览 1660回答 3
3回答

呼唤远方

NSDate并且timeIntervalSince*方法将返回a NSTimeInterval,该精度为毫秒以下精度的两倍。NSTimeInterval以秒为单位,但是它使用双精度来提高精度。为了计算毫秒时间精度,您可以执行以下操作:// Get a current time for where you want to start measuring fromNSDate *date = [NSDate date];// do work...// Find elapsed time and convert to milliseconds// Use (-) modifier to conversion since receiver is earlier than nowdouble timePassed_ms = [date timeIntervalSinceNow] * -1000.0;timeIntervalSinceNow上的文档。还有许多其他的方法来计算使用这个区间NSDate,并且我会建议在寻找的类文档NSDate,其在被发现的NSDate类参考。

德玛西亚99

请不要使用NSDate,CFAbsoluteTimeGetCurrent或gettimeofday测量经过的时间。这些都依赖于系统时钟,它可以在改变任何时间,由于许多不同的原因,诸如网络时间同步(NTP)更新时钟(经常发生以调整漂移),DST调整,闰秒,等等。这意味着,如果要测量下载或上传速度,您的数字会突然出现峰值或下降,而与实际发生的情况无关。您的性能测试将具有怪异的错误离群值;并且您的手动计时器将在持续时间不正确后触发。时间甚至可能倒退,您最终会得到负增量,并且最终可能会遇到无限递归或无效代码(是的,我已经完成了这两项)。使用mach_absolute_time。自内核启动以来,它以秒为单位进行测量。它是单调递增的(永远不会向后退),并且不受日期和时间设置的影响。由于使用起来很麻烦,因此这里有一个简单的包装,可以为您提供NSTimeInterval:// LBClock.h@interface LBClock : NSObject+ (instancetype)sharedClock;// since device boot or something. Monotonically increasing, unaffected by date and time settings- (NSTimeInterval)absoluteTime;- (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute;@end// LBClock.m#include <mach/mach.h>#include <mach/mach_time.h>@implementation LBClock{&nbsp; &nbsp; mach_timebase_info_data_t _clock_timebase;}+ (instancetype)sharedClock{&nbsp; &nbsp; static LBClock *g;&nbsp; &nbsp; static dispatch_once_t onceToken;&nbsp; &nbsp; dispatch_once(&onceToken, ^{&nbsp; &nbsp; &nbsp; &nbsp; g = [LBClock new];&nbsp; &nbsp; });&nbsp; &nbsp; return g;}- (id)init{&nbsp; &nbsp; if(!(self = [super init]))&nbsp; &nbsp; &nbsp; &nbsp; return nil;&nbsp; &nbsp; mach_timebase_info(&_clock_timebase);&nbsp; &nbsp; return self;}- (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute{&nbsp; &nbsp; uint64_t nanos = (machAbsolute * _clock_timebase.numer) / _clock_timebase.denom;&nbsp; &nbsp; return nanos/1.0e9;}- (NSTimeInterval)absoluteTime{&nbsp; &nbsp; uint64_t machtime = mach_absolute_time();&nbsp; &nbsp; return [self machAbsoluteToTimeInterval:machtime];}@end
打开App,查看更多内容
随时随地看视频慕课网APP