1

我想知道这两者在性能上有什么不同。GCD vs自定义队列

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

    // perform complex operation 

    // dispatch back to main thread to update UI 

}); 



dispatch_async(_myCustomConcurrentQueue, ^{ 

    // perform complex operation 

    // dispatch back to main thread to update UI 

}); 

我的假设是GCD跨操作系统和其他应用程序使用,并且需要执行非常快的后台任务,并完成快速。并且创建的自定义队列与GCD分开,他们可以运行不同的任务,并且一旦释放,它们将被添加回池中。所以我的假设是,我的customQueue比复杂操作的GCD表现更好。

你的想法是什么?哪个性能更好?他们是一样的吗?

+2

不是一个完整的答案,因为我没有时间去挖掘文档参考,但是:这两个调用几乎肯定是等价的。队列的选择更多地是关于如何相对于同一队列(或其他全局并发队列)上的其他块调度块。很有可能,他们最终都会在同一个基础GCD线程上执行。 –

+1

“自定义队列”是一个GCD队列。这是同一个系统 –

回答

7

尽管高优先级的全局队列理论上可能会更快(因为您不必创建队列,线程优先级略有不同),但它与您自己的自定义并发队列之间的差异不太可能被观察到。有两个原因,虽然,你可能想使用自己的自定义队列:

  1. 某些功能,尤其是调度障碍,在全球队列是不可用的,所以如果你需要这些功能,你会想使用自定义队列。

  2. 调试您的应用程序,使用您自己的有意义名称的队列也很有用,以便您可以更轻松地识别调试器中的各个线程。

但没有材料性能的理由选择高优先级的全局并发队列VS自定义并发队列。

+0

这一切都取决于他使用的全局并发队列的优先级。例如,HIGH和BACKGROUND之间可能存在显着差异,而不仅仅是因为GCD将首先在HIGH队列中执行事情 - 对于用于执行该工作的工作线程,线程优先级也设置为不同。 – jkh

+0

@jhk很好的说明。问题是关于高优先级全局队列和自定义并发队列之间的区别,所以我假设OP正在尝试将低优先级的全局队列排除在讨论之外,但是你说得很对,全局队列的顺序和他们的相对优先事项可以发挥作用。不过,我仍然认为,对于大多数应用程序来说,高优先级全局队列与自定义并发之间的差异通常不会被观察到。不过,我试图澄清我的答案。 – Rob

0

我敢肯定,如果您创建自己的队列,它最终会被添加到幕后的GCD中。我想这是更偏好的事情。

1

那么,你没有说如何创建_myCustomConcurrentQueue(它可能是一个串行队列或并发队列),但假设它是一个并发队列,那么它将具有可能与全局并发队列不同的优先级,两者都有就GCD如何从其内部“队列队列”阻止列表以及创建的线程的实际线程优先级中调度块或函数的方式来完成工作!

请阅读dispatch_queue_create(3)手册页,并特别注意“全局并发队列”部分。它包含了一些关于这个确切主题的非常丰富的言论(在这里太多的剪切和粘贴)。