【问题标题】:Converting mach_absolute_time to (nano)seconds in iOS (objective-C)在 iOS 中将 mach_absolute_time 转换为 (nano) 秒 (objective-C)
【发布时间】:2020-03-23 14:24:45
【问题描述】:

我正在尝试在 iOS 中编写一个辅助方法,以允许我在秒(或纳秒)内使用 mach_absolute_time(),以便我可以找到时间导数传入的设备传感器数据。这是我的尝试:

#include <mach/mach_time.h>

- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
    mach_timebase_info_data_t _clock_timebase;
    double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
    return nanos / 10e9;
}

上面的代码正在编译,但我得到的当前警告是“'*' 的右操作数是垃圾值”。另外,在任何情况下它都不会返回一个合理的结果:/

根据我的阅读,mach_absolute_time() 有一些特质,所以我认为让这个工作可能对其他人有用。

所有帮助都慷慨地接受了。谢谢

//// 编辑 ////

感谢 Rob Napier 的超快速回答,下面是包含初始化的方法:

#include <mach/mach_time.h>

- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
    mach_timebase_info_data_t _clock_timebase;
    mach_timebase_info(&_clock_timebase); // Initialize timebase_info
    double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
    return nanos / 10e9;
}

【问题讨论】:

  • FWIW,CACurrentMediaTime() 返回 mach_absolute_time() 转换为秒。
  • 仅供参考,以后不要编辑您的问题以包含答案,请随时 post an answer to your own question
  • 会的,罗伯。我知道你发现了我的新手!
  • 为了完整起见,用“Objective-C”标记它。有趣的问题!

标签: ios objective-c iphone time mach


【解决方案1】:

你已经声明了_clock_timebase,但你从未初始化它,所以它只是在堆栈上填充了垃圾值。你的意思是:

mach_timebase_info_data_t _clock_timebase;
mach_timebase_info(&_clock_timebase); // Initialize timebase_info
...

您可能会发现使用AbsoluteToNanoseconds 为您执行此操作更方便。如需完整示例,请参阅QA1398: Mach Absolute Time Units

注意mach_timebase_info is promised to be stable,所以如果你愿意,你可以一次性初始化它。 (如果它不稳定,用现有的 API 检查它是不可能避免竞争条件的,这很好......)

【讨论】:

  • 啊,非常感谢!我也会考虑使用AbsoluteToNanoseconds
  • 刚刚看到AbsoluteToNanoseconds 已被弃用!
  • 我知道马赫绝对时间并经常使用它来测量绝对时间差异,以进行性能/计时测量。但是-如何转换为 NSDate?由于某种原因,我找不到答案。
  • @MottiShneor mach_time 测量系统唤醒时发生的滴答数。这与 NSDate 不是特别兼容,它代表一个特定的时刻。这意味着对 mach_absolute_time 的两次调用之间的差异不能直接转换为 NSTimeInterval (这是 NSDate 的基础)。如何转换这些值取决于您实际尝试测量的内容。
  • 我从内核(EndpointSecurity 框架)收到一系列事件,这些事件带有绝对马赫时间(以及另一个马赫绝对时间作为回答这些事件的截止日期)的时间戳。我想以某种方式翻译为事件的“挂钟时间”......
猜你喜欢
  • 1970-01-01
  • 2016-08-30
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多