在 macOS Sierra 上的任何 iOS 模拟器中 Nanosleep 太长

Nanosleep too long in any iOS simulator on macOS Sierra

iOS 模拟器中的 Nanosleep(运行 在 MacOS Sierra 上使用 XCode 8.1 和 8.2beta)睡眠时间比所需持续时间长约 5 倍。

这不会发生在真正的 iPhone 7 设备或 macOS Sierra 应用程序中,只会发生在模拟器中。

是否可以在模拟器中获得更准确的睡眠持续时间,或者这是一个错误?

struct timespec request;
request.tv_sec = 0;
request.tv_nsec = 17000000; // 17ms

mach_timebase_info_data_t base;
mach_timebase_info(&base);

while (1) {
    uint64_t start, end, elapsed;
    start = mach_absolute_time();

    nanosleep(&request, NULL);

    end = mach_absolute_time();
    elapsed = (end - start) / base.denom;

    printf("Sleep = %f msec\n", elapsed * 1E-6);
}

输出:


    睡眠 = 84.451425 毫秒
    睡眠 = 69.947846 毫秒
    睡眠 = 95.484521 毫秒
    睡眠 = 72.795438 毫秒
    睡眠 = 80.162972 毫秒
    睡眠 = 70.265713 毫秒
    ...

该系统调用 ony 保证您将在请求的持续时间后的某个时间安排。您不应该对之后的时间做出任何假设。

也就是说,Sierra 上的 Xcode 8.0-8.2 运行 存在一个问题,导致模拟器进程的调度优先级低于预期。这可能是您看到设备和 sim 卡之间行为差异的原因。