2013-11-29 4 views
4

Мне интересно узнать о различиях в производительности между двумя различными методами фильтрации данных. Вот что я работаю с:Массивный фильтр против Core Data pull performance

  • Набора основных данных объектами
  • A UISegmentedControl, который представляет булев фильтр (узнал против не узнали)
  • A UITableView, который отображает отфильтрованный набор данных

Как я понимаю, есть два возможных подхода здесь:

  1. Выдвижные весь основной набор данных в viewDidLoad. Фильтрация массива данных с использованием предиката при изменении значения сегментарного управления. Перезагрузите таблицу.
  2. Первоначально вытащите набор данных ядра с помощью предиката. Когда изменяется сегментированное значение управления, перетащите набор данных ядра с обновленным предикатом. Перезагрузите таблицу.

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

+1

Я предполагаю, что если вы используете fetchedResultsController, а не NSArray, вы получаете хорошую интеграцию с UITableView, однако в зависимости от вашего приложения вы можете получить от этого мало пользы. –

+0

О, не знаю, как я пропустил этот класс. Спасибо, я посмотрю! – Whoa

+1

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

ответ

3

Я не ожидаю, что будет какая-то заметная разница в скорости.

Поэтому эти лучшие практики, которые я считаю уместным здесь:

  1. избежать преждевременной оптимизации.
  2. Вы ограничены памятью чаще, чем скорость.
  3. Дизайн заранее.

Из этого я делаю вывод три очка советы, которые относятся к текущей задаче:

  1. Go с помощью метода, который является самым простым в обслуживании.
  2. Не тяните больше объектов из данных Core, чем необходимо.
  3. Имейте некоторую стратегию по обновлению данных в представлении таблицы.

Чтобы объединить эти пункты в один совет, это лучше использовать класс NSFetchedResultsController для отображения основных данных, в таблицах, как это специально разработан для этой цели:

  1. инкапсулирует идею «чанке данных, которые я сейчас показываю ».
  2. Сохраняет вашу память, не вытягивая вещи, которые вам не нужны.
  3. Помогает с обновлением данных в виде таблицы.

Вы можете играть с примерами него путем создания нового основных данных на основе проекта в Xcode (4.4 или более поздней версии). Это ближе ко второму из ваших подходов.

2

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

Загрузка всего фронт в одном массиве, вероятно, придется:

  • Медленнее время запуска (потому что делать большую выборку сразу)
  • Высшего использования памяти (так как вы все выборок, а не просто подмножество)
  • быстрее при переключении между параметрами фильтра (так как у вас уже есть данные)

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

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

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

+0

Фантастическое объяснение. Мне любопытно, если бы вы назвали файл размером 1,8 мегабайта, содержащий только строки «small». Я уверен, что мне удастся использовать Array, но я рассматриваю использование Core Data вместо массива. – Adrian

Смежные вопросы