正常运行时间的iOS的Objective-C - 精确到毫秒(Uptime iOS Objecti

2019-08-22 21:53发布

我试图让正常运行时间为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;
}

它的伎俩。 但是,它返回整秒。 没有办法让毫秒出来呢?

Answer 1:

内核不(显然)存储它的开机时间更高分辨率的时间戳。

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 。 这是硬编码始终在其返回0 nanosecs说法。



Answer 2:

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

NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];

NSTimeInterval是一个typedef double ,代表秒。)



Answer 3:

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

+ (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;
} 


文章来源: Uptime iOS Objective-C - millisecond precision