2009-09-20 86 views
27

我用这个代码,以跟踪最后一次重新启动的:什么是mach_absolute_time基于iPhone

+ (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没有记录睡眠时间。或者我错了吗?

我真的很希望能够得到当设备重新启动最后一个时间戳。有任何想法吗?

+0

可以#包括“CAHostTimeBase.h”从CoreAudio的实用工具类看https://developer.apple.com/library/ios/qa/qa1643/_index.html – 2015-03-18 08:50:05

回答

44

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

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)); 
} 
+6

它看起来像你的实验导致了同样的解决方案,在由苹果的工程师到达。 https://developer.apple.com/library/mac/qa/qa1398/_index.html – user371320 2012-03-10 01:20:27

+0

Fwiw后者似乎是为OSX。 – JohnK 2013-04-25 01:39:42

+3

此功能对iOS不正确。在返回字符串中进行整数值计算。由于在iPhone 5上,s_timebase_info.numer = 125和s_timebase_info.denom = 3,所以最终您可以在请求之间的约40秒内获得相同的正常运行时间。为了正确性,将float mach_absolute_time()乘以float 1.0。 – malex 2013-12-13 12:04:42

8

如果你不关心了很多关于计算时间,你可以使用简单的OBJ-C类从基金会

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime]; 
+0

什么叫“完成时间”是什么意思? – Eddy 2014-03-07 07:40:40

+1

对不起,拼写错误,“计算时间”。我的意思是obj-c比纯C代码慢一点。 – malex 2014-03-07 09:40:34

+0

谢谢@malex :) – Eddy 2014-03-08 00:03:07