gpt4 book ai didi

ios - 为什么在模拟器上运行时 mach_wait_until 迟到?

转载 作者:可可西里 更新时间:2023-11-01 02:11:18 25 4
gpt4 key购买 nike

我正在使用下面的代码来使用 mach_wait_until() 等待指定的时间段(以纳秒为单位)。

private func startTimerAndResume(){

let idealNanos: UInt64 = 1250130250 //1.25 seconds

let deadline = CFAbsoluteTime(mach_absolute_time() + (timeUnitsFor(nanos: idealNanos))/100)

let x = mach_absolute_time()

mach_wait_until(UInt64(deadline))

let y = mach_absolute_time()


var timeBaseInfo = mach_timebase_info_data_t()
mach_timebase_info(&timeBaseInfo)
let elapsedNanos = (y - x) * UInt64(timeBaseInfo.numer) / UInt64(timeBaseInfo.denom);

print("deadline (aka mach-abs-time + timeUnitsFor()) = \(deadline)")
print("(mach-abs-y)-(mach-abs-x) = \(y-x)")
print("error in time units = \((y-x)-(timeUnitsFor(nanos: idealNanos))/100)")
print("elapsed nanos actual = ", elapsedNanos)
print("elapsed nanos ideal = ", idealNanos)
print("error in nanoseconds = \(elapsedNanos - idealNanos)")
}


private func timeUnitsFor(nanos: UInt64)-> UInt64{

var timeBaseInfo = mach_timebase_info_data_t()
mach_timebase_info(&timeBaseInfo)

let numer: UInt64 = UInt64(timeBaseInfo.numer)
let denom: UInt64 = UInt64(timeBaseInfo.denom)

//elapsed time in nanoseconds = timUnits * (numer / denom) ... therefore ->
let timeUnits: UInt64 = (nanos*denom/numer)*(UInt64(100))//multiply by 100 to preserve decimal before truncation caused by UInt64() conversion
print("timeUnits = \((timeUnits)/100) for target nanos \(nanos) when numer = \(numer) and denom = \(denom)")
return timeUnits
}

当我在我的实际 iPhone 设备上运行它时,错误通常在 1 毫秒左右,输出是这样的:

timeUnits = 30003126 for target nanos 1250130250 when numer = 125 and denom = 3

截止日期(又名 mach-abs-time + timeUnitsFor())= 4025277628801.0

(mach-abs-y)-(mach-abs-x) = 30027213

timeUnits = 30003126 for target nanos 1250130250 when numer = 125 and denom = 3

时间单位错误 = 24087

实际经过的纳米 = 1251133875

经过的纳米理想 = 1250130250

纳秒误差 = 1003625

然而,当我在我的模拟器上运行它时,计时器始终延迟 70 到 74 毫秒,这是输出:

当 numer = 1 和 denom = 1 时,目标 nanos 1250130250 的 timeUnits = 1250130250

截止日期(又名 mach-abs-time + timeUnitsFor())= 691695760744956.0

(mach-abs-y)-(mach-abs-x) = 1322288698

当 numer = 1 和 denom = 1 时,目标 nanos 1250130250 的 timeUnits = 1250130250

时间单位错误 = 72158448

实际经过的纳米 = 1322288698

经过的纳米理想 = 1250130250

纳秒误差 = 72158448

我想知道为什么模拟器每次都晚70到74毫秒。我做的纳秒和马赫时间单位之间的转换是错误的吗?谢谢

最佳答案

模拟器不是用于时钟周期精确测试的时钟周期精确 ARM 模拟器。它是为英特尔构建的 iOS,并与主机操作系统的其余部分共享内核。

您的计时器可能会在模拟器中合并,而它们不在设备上。根据您的主机配置和运行时版本,模拟器进程可能在 Utility QoS 层运行。

因此,您看到时间差异的原因是以下一个或多个原因:

  • 英特尔与 ARM
  • 不同的内核版本(主机内核与配对的 iOS 内核版本)
  • 与您系统上的其他进程争用
  • 由于不同的 QoS 层而导致的计时器合并

您不应该依赖于在特定窗口内取回控制权,因为这不在 API 契约(Contract)中。您将在该时间过后的某个时间安排。

关于ios - 为什么在模拟器上运行时 mach_wait_until 迟到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40858224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com