我的经验与您的相匹配(尽管不是 100 个线程;请进行一些检测以确保您确实同时运行了这么多线程。我从未见过它如此之高)。除非你手动管理并发操作的数量,NSOperationQueue
否则往往会产生过多的并发操作。(我还没有看到有人用可测试的代码而不是文档中的推论来反驳这一点。)对于可能产生大量潜在并发操作的任何事情,我建议使用setMaxConcurrentOperations
. 虽然不理想,但我经常使用类似这样的功能来辅助(这当然不能帮助您在队列之间取得平衡,因此非常不理想):
unsigned int countOfCores() {
unsigned int ncpu;
size_t len = sizeof(ncpu);
sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);
return ncpu;
}
我热切地等待任何人发布真实代码来演示NSOperationQueue
自动为 CPU 绑定操作执行正确的负载平衡。我发布了一个示例要点,展示了我在说什么。如果不调用setMaxConcurrentOperations:
,它将在 2 核 iPad 3 上生成大约 6 个并行进程。在这个没有争用或共享资源的非常简单的情况下,这会增加大约 10%-15% 的开销。在具有争用的更复杂的代码中(尤其是在操作可能被取消的情况下),它可以使事情变慢一个数量级。