在 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 卡之间行为差异的原因。
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 卡之间行为差异的原因。