NSArray filtering: в каком случае используются предикаты, а в каких - блоки? - PullRequest
5 голосов
/ 07 февраля 2011

С точки зрения производительности, на относительно большом массиве (пока обычный счет для исходного массива составляет ± 20000), какой метод лучше всего подходит для его фильтрации? Блоки или предикаты?

Большинство иваров содержащихся объектов являются строками, и я хочу запросить их.

Ответы [ 2 ]

5 голосов
/ 07 февраля 2011

Блоки могут быть быстрее:

  1. Вы используете NSEnumerationConcurrent для перечисления массива.
  2. Когда вы найдете объект, который соответствует вашему условию, отправьте другой блок в последовательную очередь, которая добавляет объект в массив результатов. (Вы не можете сделать это одновременно, потому что NSMutableArrays не являются потокобезопасными.)

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

Другими способами является одновременное перечисление с использованием блоков и фильтрация с использованием предикатов. filterUsingPredicate: может быть быстрее, поскольку NSArray будет иметь возможность использовать внутренние знания для создания массива результатов быстрее, чем повторяющиеся сообщения addObject:. Но это просто возможность; единственный способ узнать наверняка - это сравнить, и даже тогда ответ может измениться в любое время (в том числе в одном и том же процессе, для разных входных массивов или разных объектов в массиве).

Я бы посоветовал сразу реализовать это, используя предикаты, а затем использовать инструменты, чтобы определить, не является ли это проблемой производительности. Если нет, победит четкий код. Если это проблема производительности, попробуйте параллельное перечисление.

3 голосов
/ 07 февраля 2011

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

...