Когда использовать NSEnumerationConcurrent

Время от времени я замечаю, что использую блок для итерации по коллекции без записи в какие-либо общие данные и без каких-либо побочных эффектов. Я подумываю о добавлении опции NSEnumerationConcurrent, а затем отказываюсь от нее, поскольку я не совсем понимаю, когда ее стоит использовать.

Итак, у меня есть конкретный вопрос, и более общий.

Первый вопрос: Вот возможно, слегка надуманный пример использования блока для одновременного выполнения чего-то тривиального:

CGFloat GetAverageHeight(NSArray* people)
{
  NSUInteger count = [people count];
  CGFloat* heights = malloc(sizeof(CGFloat) * count);

  [people enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock:
  ^(id person, NSUInteger idx, BOOL* stop)
  {
    heights[idx] = [person height];
  }];

  CGFloat total= 0.0;
  for (size_t i = 0 ; i < count ; i++) total += heights[i];
  free(heights);
  return total / count;
}

Игнорирование того факта, что непараллельное перечисление могло просто суммировать высоту напрямую, без необходимости вызова malloc или второй половины функции, есть есть ли здесь смысл использовать NSEnumerationConcurrent? Отменяют ли накладные расходы на использование GCD (или того, что NSEnumerationConcurrent делает в фоновом режиме) выгоду от одновременного получения тривиального свойства? Насколько менее тривиальной должна быть работа блока, прежде чем будет целесообразно использовать NSEnumerationConcurrent?

Второй вопрос: в более общем плане, следует ли мне рассматривать параллелизм как то, что я должен использовать, когда вижу возможность для этого (обоснование: предположительно, суть из этих API-интерфейсов заключается в том, что они делают параллелизм менее частным случаем и большей частью общей структуры программы) или просто оптимизацию, которую я должен использовать только в том случае, если я обнаружил конкретную проблему с производительностью и считаю, что параллелизм - это ответ (объяснение: ошибки в параллельном коде - это кошмар для отслеживания)?

13
задан Chris Devereux 24 July 2011 в 13:07
поделиться