如何减慢 GCD 并发队列的任务?

How can I slow down a GCD concurrent queue's tasks?

出于性能调试目的,每当由 GCD 并发队列操作的后台任务完成其任务之一时,我需要观察 UI 更新的进度。

如果没有人为的延迟,就很难跟上和反应正在发生的事情。

每个任务可能需要 10 毫秒。我喜欢它花一秒钟。

我尝试通过向其添加 sleep(1); 来减慢队列的任务,但这将允许其他等待任务 运行。

我需要的是每个任务都真正地占据它的队列,直到那额外的一秒结束。

如何在不重新组织整个排队代码的情况下做到这一点?毕竟,这仅用于调试,我只想插入带有条件编译的代码,而不是最终使用用于调试和非调试构建的不同代码。

您可以旋转一段时间,例如:

func spin(for interval: CFTimeInterval) {
    let start = CACurrentMediaTime()
    while (CACurrentMediaTime() - start) < interval { }
}

因此,要让一个线程保持忙碌 1 秒,它将是:

spin(for: 1)

你永远不会在生产应用程序中这样做,但它可能有助于你的诊断目的。

同时我也想出了一个方法,和 Rob 的方法一样,就是在循环中消磨时间:

mach_timebase_info_data_t tb;
mach_timebase_info (&tb);
double tbScale = 1.0 / (1e-9 * (double)tb.numer / (double)tb.denom);
uint64_t now, end = mach_absolute_time();
end += tbScale * 0.5; // -> wait 0.5 sconds
do {
    now = mach_absolute_time();
} while (now < end);