NSOperationQueue распределяет темы медленно? - PullRequest
1 голос
/ 14 июля 2010

Я пишу свои первые многопоточные приложения для iPhone, используя NSOperationQueue, потому что я слышал, что он загружается лучше и потенциально быстрее, чем управление собственной потоковой диспетчеризацией.

Я вычисляю результат платы Game of Life, разбивая доску на отдельные части и имея отдельные потоки, рассчитываю каждую доску, а затем склеиваю их обратно, для меня это кажется более быстрым способом, даже с огромными накладными расходами расщепление и сплайсинг. Я создаю объект NSInvocationOperation для каждой доски и затем отправляю их в OperationQueue. После того, как я отправил все куски доски, я сижу и жду, пока они все закончат вычисления с помощью вызова waitUntilAllOperationsAreFinished к OperationQueue.

Кажется, что это должно работать, и это работает нормально. НО потоки вызываются очень slooooowwwlllyyyyyy, и поэтому многопоточная версия вычисляется дольше, чем однопоточная версия! ОН НЕТ! Я следил за созданием и завершением NSOperations, отправленных в NSOperationQueue, и обнаружил, что некоторые просто сидят в очереди операций do-diddly-daddlin некоторое время, прежде чем их вызовут намного позже. Сначала я подумал: «Эй, может быть, очередь может обрабатывать только столько потоков одновременно?», А затем поднял значение Queues maxConcurrentOperationCount до произвольно большого числа (намного больше, чем количество плат), но я испытал то же самое!

Мне было интересно, может, кто-нибудь подскажет мне, как включить NSOperationQueue в «перегрузку», так сказать, чтобы он как можно быстрее отправлял свои очереди, или это, или скажите мне, что происходит!

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Потоки волшебным образом не заставляют ваш процессор работать быстрее.

На однопроцессорном компьютере, если вашему алгоритму требуется миллион команд для выполнения, разделение его на 10 частей по 100 000 команд каждый и выполнение его в 10 потоках все равно займет столько же времени. На самом деле, это займет больше времени, потому что вы добавили накладные расходы на разделение, слияние и переключение контекста между потоками.

0 голосов
/ 14 июля 2010

Очередь по-прежнему существенно ограничена вычислительной мощностью телефона.Если телефон может запускать только два процесса одновременно, вы получите (максимум) почти двукратное увеличение скорости, разделив задачу.Больше, чем это, и вы просто добавляете накладные расходы без выгоды.

Это особенно верно, если вы выполняете процедуру с интенсивным использованием процессора и памяти, такую ​​как вычисление платы.NSOperationQueue имеет смысл, если у вас есть несколько операций, которые должны ждать в течение продолжительных периодов времени.Циклы пользовательского интерфейса и загрузка по сети были бы отличными примерами.В этих случаях другие операции могут завершаться, пока неактивные ожидают ввода.

Для чего-то вроде вашей доски операция для каждого элемента сетки никогда не имеет условий ожидания.Он всегда работает на полной скорости, пока не будет сделано.

См. Также: iPhone Максимальный предел потока? и Дизайн приложения для параллелизма

...