1

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

我正在计算生命游戏板的结果,方法是将板分成单独的部分,让单独的线程计算每个板,然后将它们拼接在一起,对我来说,这似乎是一种更快的方法,即使分割和拼接的开销很大. 我正在为每个板创建一个 NSInvocationOperation 对象,然后将它们发送到 OperationQueue。在我发送了所有的板子后,我坐下来等待它们都完成对 OperationQueue 的 waitUntilAllOperationsAreFinished 调用的计算。

这似乎应该可以工作,并且确实可以正常工作,但是线程被调用得很慢,因此实际上多线程版本的计算时间比单线程版本要长!哦不!我监视了发送到 NSOperationQueue 的 NSOperations 的创建和终止,发现有些只是在 Operation Queue do-diddly-daddlin 中坐了一会儿,然后才被调用。起初我想“嘿,也许队列一次只能处理这么多线程”,然后将队列 maxConcurrentOperationCount 提高到某个任意高的数字(远高于板件的数量),但我遇到了同样的事情!

我想知道是否有人可以告诉我如何将 NSOperationQueue 踢到“超速”状态,以便它尽快调度其队列,或者告诉我发生了什么!

4

2 回答 2

1

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

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

于 2010-07-14T18:06:48.080 回答
0

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

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

对于像你的板子这样的东西,每一块网格的操作都没有任何等待条件。它总是全速搅拌,直到完成。

另请参阅:iPhone 最大线程限制?并发应用程序设计

于 2010-07-14T18:01:16.713 回答