正常运行时间iOS Objective-C - 毫秒级精度

时间:2013-04-14 05:02:39

标签: ios objective-c uptime

我正在努力让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;
}

它可以解决问题。但是,它整整回来了。有没有办法从这里获得毫秒?

3 个答案:

答案 0 :(得分:3)

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

KERN_BOOTTIMEthe sysctl_boottime function in 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。

答案 1 :(得分:2)

如果您想要纯粹的Objective-C,请尝试

NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];

NSTimeIntervaldouble的typedef,代表秒数。)

答案 2 :(得分: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;
}