NSOperationQueue缓慢调度线程?

时间:2010-07-14 17:55:37

标签: iphone multithreading nsoperation nsoperationqueue

我正在使用NSOperationQueue编写我的第一个多线程iPhone应用程序,因为我听说它的负载更好,并且可能比管理我自己的线程调度更快。

我正在计算生命游戏板的结果,将棋盘分成单独的棋子,然后用单独的线程计算每个棋盘,然后将它们拼接在一起,对我来说,这似乎是一种更快的方式,即使有巨大的开销分裂和拼接。我正在为每个板创建一个NSInvocationOperation对象,然后将它们发送到OperationQueue。在我发送了所有板块之后,我坐下来等待所有人完成使用waitQntilAllOperationsAreFinished调用OperationQueue进行计算。

这似乎应该可行,并且它确实工作得很好但是线程被调出非常slooooowwwlllyyyyyy所以它实际上最终需要花费更长时间来计算多线程版本而不是单线程版本!哦NO!我监视了发送到NSOperationQueue的NSOperations的创建和终止,发现有些人只是在操作队列do-diddly-daddlin中待了一段时间,之后他们很快就被调用了。起初我想“嘿,也许队列一次只能处理这么多线程”,然后将队列maxConcurrentOperationCount提升到一些任意高的数字(远高于板块数量)但我经历了同样的事情!

我想知道是否有人可以告诉我如何将NSOperationQueue踢进“过载”,以便尽快发送队列,或者告诉我发生了什么!

2 个答案:

答案 0 :(得分:1)

线程不会让你的处理器运行得更快。

在单处理器计算机上,如果您的算法需要执行一百万条指令,则将其分成10个块,每个100,000条指令并在10个线程上运行它仍然需要同样长的时间。实际上,它需要更长的时间,因为你在线程之间添加了拆分,合并和上下文切换的开销。

答案 1 :(得分:0)

队列仍然受到手机处理能力的限制。如果手机只能同时运行两个进程,那么通过分割任务,您将获得(最多)接近两倍的速度增加。除此之外的任何事情,你只是增加了开销而没有收获。

如果您正在运行处理器和内存密集型例程(如电路板计算),则尤其如此。如果您有多个操作需要等待很长一段时间,NSOperationQueue才有意义。用户界面循环和网络下载将是很好的例子。在这些情况下,其他操作可以在非活动状态等待输入时完成。

对于像你的电路板这样的东西,每个网格的操作都没有任何等待条件。它一直在全速运转,直到完成。

另请参阅:iPhone Maximum thread limit?concurrency application design