如何降低GCD并发队列的任务速度?

时间:2019-03-30 20:29:54

标签: macos grand-central-dispatch

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

没有人为的延迟,很难跟踪和响应所发生的事情。

每个任务大概需要10毫秒。我希望它花一秒钟。

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

我需要的是每个任务实际上一直占据着队列,直到那多余的一秒钟结束。

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

2 个答案:

答案 0 :(得分:1)

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

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

因此,要使线程繁忙1秒钟,应该是:

spin(for: 1)

您永远不会在生产应用程序中执行此操作,但是它可能可以满足您的诊断目的。

答案 1 :(得分: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);