Инструментарий параллельной обработки на двухъядерном устройстве iOS - PullRequest
1 голос
/ 09 апреля 2011

В какой-то момент мое приложение для iOS выполняет некоторую обработку, связанную с процессором, которая длится около 2 минут. Эта обработка очень «параллелизуема», и я реорганизовал ее в группу независимых рабочих блоков. Мой цикл обработки теперь выглядит так:

while ([inputSource hasDataToProcess]) {
    size_t batchSize = [inputSource prepareNextBatch];
    [collectorArray enumerateObjectsWithOptions:NSEnumerationConcurrent
                                     usingBlock:^(BatchItemCollector *collector, NSUInteger idx, BOOL *stop) {
         [collector processBatch:[inputSource currentBatchElement: idx]];
     }];
}

Таким образом, внешний цикл является последовательным, а внутренний цикл параллельным благодаря методу enumerateObjectsWithOptions:usingBlock: для NSArray. collectorArray содержит количество рабочих, которые обрабатывают один элемент в пакете.

Моя проблема в том, что когда я использую опцию NSEnumerationConcurrent, мой код не работает на iPad 2 быстрее, чем без него. Насколько я понимаю, этот вариант будет использовать преимущества, однако многие ядра были доступны. Так как моя обработка связана с процессором, а у iPad два ядра, я ожидал, что он увеличится в два раза.

Теперь три вопроса:

1- Правильно ли я считаю, что NSEnumerationConcurrent сделает enumerateObjectsWithOptions:usingBlock: действительно параллельным на многоядерных машинах? Даже на iOS? Официальная документация на это не указана.

2- Что более важно, как я могу это проверить? Инструменты должны быть правильным инструментом, но мне не удалось получить из них убедительные данные. Я попробовал шаблон Time Profiler и Activity Monitor. В документации по инструментам упоминается шаблон «Многоядерный», но говорится, что он предназначен для кода Mac, а не для iOS. Поскольку я довольно новичок в инструментах, думаю, я что-то упустил.

3- Любое предложение, возможно, с использованием другой конструкции, чем enumerateObjectsWithOptions:usingBlock:? Существует множество возможных других, но немногих, которые удобно применять.

Большое спасибо.

...