【问题标题】:Measure elapsed time in OS X在 OS X 中测量经过的时间
【发布时间】:2015-05-12 19:02:54
【问题描述】:

我需要测量经过的时间,以便知道何时超过了某个时间段。

我曾经为此使用Ticks() 和Microseconds(),但这两个函数现在都已弃用。

CFAbsoluteTimeGetCurrent 不是正确的使用方式,因为它可能会向后运行,如文档中所述:

重复调用此函数并不能保证单调 越来越多的结果。系统时间可能会减少,因为 与外部时间参考同步或由于显式 用户更改时钟。

还有什么不被弃用且相当面向未来的?

【问题讨论】:

  • mach_absolute_time?精彩讨论:stackoverflow.com/questions/23378063/…(题外话:嗨,Thomas!)
  • (嗨,MattN!)是的,感谢有关 mach_absolute_time 的指针 - 我同时找到了 Q&A 1398,但不知道溢出。不过,我希望还有其他方法,也许使用计时器(尽管我不知道如果时钟变回它们是否正确运行)。
  • 在 DriverServices.h 中声明了其他已弃用的计时函数 UpTime。该标题中的注释说“改用 CFAbsoluteTime 或马赫时间例程”。

标签: macos cocoa core-foundation mach


【解决方案1】:

如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;

不过,这也可能不是万无一失的。正如this answer 中所指出的,这些值在某些情况下可能会溢出。

【讨论】:

  • 我使用mach_absolute_time 取得了不错的成绩。不久前,我在它周围做了一个小 Cocoa 类包装器,如 here 所述。
【解决方案2】:

使用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 可以容纳几分之一秒(例如十分之一、百分之一、千分之一等)

【讨论】:

  • NSDate 就像 CFAbsoluteTimeGetCurrent 一样,能够向后运行,不是吗?我的意思是,用户可以简单地手动更改他的时钟,而你已经让它恢复了。或者timeIntervalSinceNow 不是很容易出现这种情况吗?
  • 是的,不幸的是,几乎任何日期/时间方法都容易出现这种情况。如果您担心它发生的可能性,您可以在经过时间的指定间隔内进行检查,以确定当前时间是否小于开始时间 - 如果它是无效的。
猜你喜欢
  • 1970-01-01
  • 2014-09-05
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2017-07-13
  • 2019-12-30
相关资源
最近更新 更多