什么是基于iPhone的mach_absolute_time

Max*_*007 31 iphone timer

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

+ (float) secondsSinceLastReboot{
     return ((float)(mach_absolute_time())) * ((float)timebase.numer) / ((float)timebase.denom) / 1000000000.0f;
}
Run Code Online (Sandbox Code Playgroud)

我假设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
Run Code Online (Sandbox Code Playgroud)

我绝对肯定我当时没有重启我的设备.我的设备一周内没有启动.

此外,当我从电缆上取下设备并运行此应用程序时,似乎当设备进入休眠状态时,lastRebootTime将来会开始转移.似乎mach_absolute_time没有考虑睡眠时间.或者我错了吗?

我真的希望能够从设备上次重启时获取时间戳.有任何想法吗?

Bad*_*ate 49

我自己也遇到了一些麻烦.没有很多好的文档,所以我选择了实验.这是我能够确定的:

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));
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来您的实验导致Apple的工程师得到了相同的解决方案.https://developer.apple.com/library/mac/qa/qa1398/_index.html (7认同)
  • 此功能适用于iOS.在返回字符串中,您进行整数值计算.因为在iPhone 5上s_timebase_info.numer = 125和s_timebase_info.denom = 3,最终您可以在请求之间的大约40秒内获得相同的正常运行时间.将mach_absolute_time()乘以float 1.0以获得正确性. (3认同)

mal*_*lex 9

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

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
Run Code Online (Sandbox Code Playgroud)

  • @ g212gs请注意,这是系统正常运行时间!模拟器的系统 - OSX.所以你得到了正确的答案 - 相同的正常运行时间,直到你重新启动mac (2认同)