并发队列与私有调度队列

时间:2014-05-16 22:53:33

标签: objective-c grand-central-dispatch

如果我需要创建大量队列(例如10个队列用于图像加载),使用全局并发队列或创建相同数量的私有调度队列会更快吗?对于四核CPU,并发队列在变为后续排队任务的串行队列之前是否限制为四个并发队列?

2 个答案:

答案 0 :(得分:1)

我建议创建自己的并发队列,该队列限制允许的并发操作数。例如,您可以创建一个并发NSOperationQueue并将maxConcurrentOperationCount设置为四或五。然后将所有同步图像检索请求添加到该请求。例如:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 5;

然后只需添加所有图像请求:

[queue addOperationWithBlock:^{
    // request image
}];

你可以获得比这更好的东西,但这是你的两个建议的基本替代品。但这将确保您没有超过五个并发网络请求。

请注意,为了实现此目的(以及您的GCD建议),您的操作本身必须是同步的。如果它们不是同步的,那么你必须做一些额外的工作,以确保在它们执行的任务完成之前操作不会完成。


如果您想知道他们什么时候完成,您可以使用完成操作:

NSOperation *completionOperation = [NSBlockOperation operationWithBlock:^{
    // this is what will happen when they're done
}];

然后添加您的操作:

NSOperation *operation = [NSBlockOperation operationWithBlock:^{
    // do network request here
}];

[completionOperation addDependency:operation];

[queue addOperation:operation];

完成所有单独操作的排队后,您可以对该完成操作进行排队,在完成其余操作之前不会触发(因为您已经声明了它们之间的依赖关系):

[queue addOperation:completionOperation];

答案 1 :(得分:0)

当然,更快取决于正在进行的工作。

全局并发队列尝试将并发活动的数量与可用硬件进行匹配。这没有记录,所以它可能会或可能不匹配核心数量(或者如果它们是超线程且工作允许的话,可能是核心数量的两倍)。如果排队的操作阻止(例如,在网络活动或磁盘I / O上),则全局队列将启动新的作业。

您可以创建自己的队列来强制解决问题,但这可能无济于事。如果你有四个核心,那么排队10或20或任何数量的同时CPU重的动作不会有助于整体速度。一旦你最大限度地利用资源,你就可以将它们最大化,并且添加更多的私人队列不会改变它。