В какой-то момент мое приложение для 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:
? Существует множество возможных других, но немногих, которые удобно применять.
Большое спасибо.