4

我正在尝试为 iOS 争取正常运行时间。我正在使用 mach_absolute_time - 但我发现它在睡眠期间暂停。

我发现了这个片段:

- (time_t)uptime
{
    struct timeval boottime;
    int mib[2] = {CTL_KERN, KERN_BOOTTIME};
    size_t size = sizeof(boottime);
    time_t now;
    time_t uptime = -1;

    (void)time(&now);

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
    {
        uptime = now - boottime.tv_sec;
    }
    return uptime;
}

它成功了。但是,它会返回整秒。有什么办法可以得到毫秒?

4

3 回答 3

3

如果你想要纯 Objective-C 的东西,试试

NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];

NSTimeInterval是 的 typedef double,代表秒。)

于 2013-04-14T05:22:29.390 回答
3

内核(显然)不存储其启动时间的更高分辨率时间戳。

KERN_BOOTTIME中的sysctl_boottime函数bsd/kern/kern_sysctl.c实现。它调用boottime_sec.

boottime_sec实施于bsd/kern/kern_time.c. 它调用clock_get_boottime_nanotime,它有一个很有前途的名字。

clock_get_boottime_nanotime实施于osfmk/kern/clock.c. 在其nanosecs参数中始终返回 0 是硬编码的。

于 2013-04-14T05:33:21.037 回答
2

我知道这可能为时已晚,但你去吧:

+ (NSTimeInterval)uptime {
    struct timeval boottime;
    int mib[2] = {CTL_KERN, KERN_BOOTTIME};
    size_t size = sizeof(boottime);

    struct timeval now;
    struct timezone tz;
    gettimeofday(&now, &tz);

    double uptime = -1;

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
        uptime = now.tv_sec - boottime.tv_sec;
        uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
    }
    return uptime;
} 
于 2014-05-22T15:22:24.467 回答