【问题标题】:What is mach_absolute_time based on on iPhone什么是基于 iPhone 的 mach_absolute_time
【发布时间】:2010-11-29 20:39:27
【问题描述】:

我使用此代码来跟踪上次重启:

+ (float) secondsSinceLastReboot{
     return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}

我假设 mach_absolute_time() 是基于上次设备启动时间,就像在 mac 上一样。好像不是基于这个。我其实不知道它是基于什么的。

查看以下行为(今天的日期是2009-09-20):

lastRebootTime = [[NSDate date] addTimeInterval:-[self secondsSinceLastReboot]];
//last Reboot Time will contain : 2009-09-20 07:42:14 +0100

我绝对确定当时我没有重新启动我的设备。我的设备已经一周没有启动了。

此外,当我从电缆上拔下设备并运行此应用程序时,似乎当设备进入睡眠状态时,lastRebootTime 将在未来开始变化。 mach_absolute_time 似乎没有考虑睡眠时间。还是我错了?

我真的很希望能够获得设备上次重启时的时间戳。有什么想法吗?

【问题讨论】:

标签: iphone timer


【解决方案1】:

我自己遇到了一些麻烦。没有很多好的文档,所以我进行了实验。以下是我能够确定的:

mach_absolute_time 取决于设备的处理器。它返回自设备上次重新启动以来的滴答声(也称为正常运行时间)。为了以人类可读的形式获得它,您必须通过 mach_timebase_info(一个比率)的结果对其进行修改,这将返回十亿分之一秒(或纳秒)。为了使它更有用,我使用如下函数:

#include <mach/mach_time.h>

int getUptimeInMilliseconds()
{
    const int64_t kOneMillion = 1000 * 1000;
    static mach_timebase_info_data_t s_timebase_info;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        (void) mach_timebase_info(&s_timebase_info);
    });

    // mach_absolute_time() returns billionth of seconds,
    // so divide by one million to get milliseconds
    return (int)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
}

【讨论】:

  • 您的实验结果似乎与 Apple 工程师得出的解决方案相同。 developer.apple.com/library/mac/qa/qa1398/_index.html
  • Fwiw 后者似乎适用于 OSX。
  • 此功能在 iOS 上无法正常工作。在返回字符串中,您进行整数值计算。由于在 iPhone 5 s_timebase_info.numer = 125 和 s_timebase_info.denom = 3 上,您最终可以在请求之间的大约 40 秒内获得相同的正常运行时间。将 mach_absolute_time() 乘以 float 1.0 以确保正确性。
  • 在我的测试中,当 iOS 处于睡眠状态时,此功能不会计算在内。请参阅此问题的公认答案:stackoverflow.com/questions/12488481/…
【解决方案2】:

如果您不太关心计算时间,您可以使用 Foundation 中的简单 Obj-C 类

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];

【讨论】:

  • “完成时间”是什么意思?
  • 抱歉拼写错误,“计算时间”。我的意思是 obj-c 的工作速度比纯 C 代码慢。
  • 我用这个代码在模拟器中检查这个但不能得到区别,重启模拟器后两个系统正常运行时间相同..
  • @g212gs 请注意,这是系统正常运行时间!模拟器的系统 - OSX。所以你得到了正确的答案 - 相同的正常运行时间,直到你重新启动你的 mac
【解决方案3】:

如果有人在 Swift 中需要它(适用于 4.2 和 5.0)。

let beginTime = mach_absolute_time()

// do something...

var baseInfo = mach_timebase_info_data_t(numer: 0, denom: 0)
if mach_timebase_info(&baseInfo) == KERN_SUCCESS {
    let finiTime = mach_absolute_time()

    let nano = (finiTime - beginTime) * UInt64(baseInfo.numer) / UInt64(baseInfo.denom)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2015-09-11
    • 2018-11-06
    相关资源
    最近更新 更多