2014-05-16 42 views
0

如果我需要创建大量队列(比如10+队列用于图像加载),使用全局并发队列还是创建相同数量的私有调度队列会更快?对于四核CPU,并发队列是否被限制为四个并发队列,然后才会变成后续排队任务的串行队列?并发队列vs私人调度队列

+1

仅供参考 - 在发布更多问题之前,您应该回到最近的一些问题,看看您是否应该投票或接受一些答案。您最近几个问题中的一些问题中没有接受任何答案。接受答案会结束这个问题并帮助你的声誉。 – rmaddy

回答

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]; 
0

更快取决于正在完成的工作,当然。

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

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