2010-07-14 54 views
1

我正在使用NSOperationQueue編寫我的第一個多線程iPhone應用程序,因爲我聽說它的加載速度比管理我自己的線程調度的速度更快並且可能更快。NSOperationQueue緩慢調度線程嗎?

我正在計算一個生命遊戲板的結果,將板分成單獨的部分,並有單獨的線程計算每塊板,然後將它們拼接在一起,對我來說,這似乎是一個更快的方式,即使有巨大的開銷分裂和拼接。我爲每個板創建一個NSInvocationOperation對象,然後將它們發送到OperationQueue。在我發送了所有棋盤後,我坐下來等待它們全部完成計算,並調用OperationQueue的waitUntilAllOperationsAreFinished調用。

這看起來應該可以工作,而且它工作得很好,但是線程會調用非常slooooowwwlllyyyyyy,所以它實際上最終會花費比多線程版本更長的時間來計算,而不是單線程版本! OH NOES!我監視了發送給NSOperationQueue的NSOperations的創建和終止情況,發現有些人在稍後被調用之前就坐在Operation Queue do-diddly-daddlin一段時間。起初我以爲「嘿,也許這個隊列一次只能處理那麼多線程」,然後把隊列maxConcurrentOperationCount加到一些任意高的數字(遠遠高於棋子數量),但是我經歷了同樣的事情!

我想知道是否有人可以告訴我如何將NSOperationQueue踢到「超速驅動」,以便儘快發送它的隊列,或者告訴我發生了什麼事!

回答

0

該隊列仍受到手機處理能力的基本限制。如果手機只能同時運行兩個進程,您將通過分割任務(最多)將速度提高兩倍。除此之外,你只是增加開銷而沒有收穫。

如果您正在運行處理器和內存密集型例程(如板卡計算),則尤其如此。如果你有幾個需要等待很長時間的操作,NSOperationQueue纔有意義。用戶界面循環和網絡下載將是很好的例子。在這些情況下,其他操作可以在非活動的等待輸入時完成。

對於像你的電路板這樣的東西,每一塊網格的操作永遠不會有任何等待條件。它一直在全速奔跑,直到完成。

參見:iPhone Maximum thread limit?concurrency application design

+2

值得指出的是,沒有商業可用的iPhone可以同時運行兩個線程。他們都是單核心芯片。對於CPU限制的任務,線程是浪費時間。 – 2010-08-05 14:08:40

+0

好點。即使A4仍然是一個單核心處理器。 http://en.wikipedia.org/wiki/Apple_A4 – 2010-08-05 14:38:03

1

線程不會神奇地讓你的處理器運行得更快。

在單處理器機器上,如果您的算法需要執行一百萬條指令,將其分割爲10個10萬個指令塊,並在10個線程上運行它仍然需要很長時間。實際上,這會花費更長時間,因爲您已經在線程之間添加了拆分,合併和上下文切換的開銷。