我需要测量经过的时间,以便知道何时超过了某个时间段。
我曾经为此使用Ticks()
and Microseconds()
,但现在不推荐使用这两个函数。
CFAbsoluteTimeGetCurrent
不是正确的使用方法,因为它可能会向后运行,如文档中所述:
重复调用此函数并不能保证结果单调递增。由于与外部时间参考同步或由于用户明确更改时钟,系统时间可能会减少。
还有什么不被弃用且相当面向未来的?
我需要测量经过的时间,以便知道何时超过了某个时间段。
我曾经为此使用Ticks()
and Microseconds()
,但现在不推荐使用这两个函数。
CFAbsoluteTimeGetCurrent
不是正确的使用方法,因为它可能会向后运行,如文档中所述:
重复调用此函数并不能保证结果单调递增。由于与外部时间参考同步或由于用户明确更改时钟,系统时间可能会减少。
还有什么不被弃用且相当面向未来的?
如Q&A 1398中所述,一种方法是使用mach_absolute_time
如下:
static mach_timebase_info_data_t sTimebaseInfo;
mach_timebase_info(&sTimebaseInfo); // Determines the time scale
uint64_t t1 = mach_absolute_time();
...
uint64_t t2 = mach_absolute_time();
uint64_t elapsedNano = (t2-t1) * sTimebaseInfo.numer / sTimebaseInfo.denom;
不过,这也可能不是万无一失的。正如本答案中所指出的,在某些情况下,这些值可能会溢出。
使用NSTimeInterval
:
用于指定时间间隔,以秒为单位。
例子:
- (void)loop {
NSDate *startTime = [NSDate date];
sleep(90); // sleep for 90 seconds
[self elapsedTime:startTime];
}
- (void)elapsedTime:(NSDate *)startTime {
NSTimeInterval elapsedTime = fabs([startTime timeIntervalSinceNow]);
int intSeconds = (int) elapsedTime;
int intMinutes = intSeconds / 60;
intSeconds = intSeconds % 60;
NSLog(@"Elapsed Time: %d minute(s) %d seconds", intMinutes, intSeconds);
}
结果:
Elapsed Time: 1 minute(s) 29 seconds
目前尚不清楚您正在寻找哪种类型的精度,尽管 NSTimeInterval 可以容纳几分之一秒(例如十分之一、百分之一、千分之一等)