ArrayCollection быстрая фильтрация - PullRequest
       1

ArrayCollection быстрая фильтрация

1 голос
/ 19 сентября 2011

У меня следующая ситуация: у меня есть экран с 4 диаграммами, каждая из которых заполнена 59 коллекциями массивов. Каждая коллекция массивов имеет более 2000 точек данных.

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

Фильтрация по одному графику за раз - не вариант, поэтому я хотел бы спросить вас, что, по вашему мнению, будет лучшим подходом? (я должен использовать вектор вместо этого?). Если обобщить этот вопрос, как лучше всего фильтровать большие коллекции в flex / as3?

Спасибо.

Ответы [ 4 ]

1 голос
/ 19 сентября 2011

Вам придется выжать все возможные улучшения производительности, которые подходят:

  • используйте Vector, если это возможно, и столько, сколько сможете. Он имеет (в отличие от того, что предлагает www.flextras.com) свойство фильтра, которое принимает функцию фильтрации. ArrayCollections медленные. (Как правило, все собственные классы flex неоправданно медленны). Поэтому, если вам действительно нужно использовать ArrayCollections, используйте их только для представления результирующих векторов.

  • если проблема в том, что приложение «зависает», вы можете посмотреть на зеленые потоки, чтобы вы могли представить пользователю индикатор выполнения, чтобы у него было, по крайней мере, ощущение прогресса. http://blog.generalrelativity.org/actionscript-30/green-threads/

0 голосов
/ 21 сентября 2011

Хорошо, так что я нашел еще что-нибудь для зеленых потоков и наткнулся на проект gskinner ( PerformanceTestv2 ). Проверка генерации данных и времени рендеринга дала мне следующие результаты:

[MethodTest name = 'Проверка серии усиления:' время = 1056,0 мин = 1056 макс = 1056 отклонение = 0,000 памяти = 688] // фильтрация источника данных

[MethodTest name = 'Проверка серии усиления:' время = 24810,0 мин = 24810 макс = 24810 отклонение = 0,000 памяти = 16488] // фильтрация + рендеринг.

Далее я посмотрел, как улучшить время рендеринга графика, но не так много улучшений. Однако я нашел проект, основанный на Degrafa: Axis . Это было перенесено в flex 4, событие 4.5 ([Axiss 4.5]) 3 . Я интегрировал графики, основанные на этой платформе, и результаты пока действительно хороши.

0 голосов
/ 19 сентября 2011

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

0 голосов
/ 19 сентября 2011

Я бы предложил фильтровать большие коллекции на сервере. Это имеет несколько преимуществ:

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