如果我需要创建大量队列(比如10+队列用于图像加载),使用全局并发队列还是创建相同数量的私有调度队列会更快?对于四核CPU,并发队列是否被限制为四个并发队列,然后才会变成后续排队任务的串行队列?并发队列vs私人调度队列
0
A
回答
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繁忙的行动不会帮助整体速度。一旦你最大限度地利用资源,你最大限度地利用了资源,并且添加更多的私有队列不会改变它。
相关问题
- 1. 任务完成时,串行队列/私人调度队列如何知道?
- 2. 在iOS中调度并发队列
- 3. 并发队列离队
- 4. 排队并发队列
- 5. 调度队列和排队的NSOperation
- 6. 普通队列vs SEDA队列
- 7. 优先级队列VS队列
- 8. jms队列vs内存java队列
- 9. MSMQ私人队列消息丢失
- 10. MSMQ获取所有私人队列
- 11. 无法与MSMQ创建私人队列
- 12. 的CollectionView:scrollToItem,reloadData,并调度队列
- 13. Java并发:排队队列问题
- 14. 的iOS:未发布的调度队列
- 15. 异步调度队列触发错误
- 16. 了解调度队列
- 17. TCP发送队列深度
- 18. 协调多个并发队列
- 19. Redis队列vs MSMQ
- 20. 本地私人MSMQ到远程私人队列
- 21. C++ deque vs队列vs栈
- 22. 队列长度
- 23. 并发队列性能
- 24. 的Berkeley DB,并发队列
- 25. Python的多处理队列可靠性,队列VS SimpleQueue VS JoinableQueue
- 26. 暂停调度队列暂停其目标队列吗?
- 27. 适用于iOS应用的操作队列和调度队列
- 28. 实现函数队列调度的2D队列
- 29. 调度队列中的列表项
- 30. 队列:: push()不发送队列到IronMQ
仅供参考 - 在发布更多问题之前,您应该回到最近的一些问题,看看您是否应该投票或接受一些答案。您最近几个问题中的一些问题中没有接受任何答案。接受答案会结束这个问题并帮助你的声誉。 – rmaddy