2012-03-22 4 views
5

Я составил список всего, что может помочь улучшить производительность в очень сложном приложении с большим количеством элементов управления. Если вы хотите добавить свой, ваш прием!Решить проблему производительности с помощью приложения WPF

  • Если вы знаете размер элемента управления, снимите Auto и введите реальное значение, поэтому родители не должны разобрать весь Чайлдс, чтобы проверить размер он должен
  • Установите параметр IsHitTestVisible = False если элемент не должен быть интерактивным
  • Замораживание всех объектов, которые вы можете
  • использовать статические ресурсы вместо динамических ресурсов
  • не используйте объект Ellipse, преобразовать эллипс в пути
  • Дон использовать TextBox или этикетки, если вы можете использовать TextBlock
  • Использование Canvas вместо сетки, когда это возможно
  • Нет FlowDocument
  • виртуализировать !! VirtualizingStackPanel вместо StackPanel
  • Не используйте список, то ObservableCollection это способ быстрее
  • Используйте библиотеку для рисования, это быстрее, чем в библиотеке Shapes
  • Проверьте ваше связывание! Если привязка не работает, она может быть очень медленным
  • Не используйте Visibility.Hidden, используйте Visibility.Collapsed, когда вы можете
  • DependencyProperty является 3x быстрее, чем INotifyPropertyChanged
  • StreamGeometry быстрее тогда PathGeometry
  • Очистить обработчики событий, когда вы сделали с ними!
  • Не следует использовать свойство непрозрачности объекта, если вы можете использовать его цвет непрозрачности
  • Проверьте, если ваше приложение Hardware Rendering (Tier-2)
  • Уменьшить размер/качество вашего изображения, когда вы можете
  • Рендеринг изображения быстрее, чем вектор рендеринга!

Инструменты, которые я использую:

  • WPF инспектор
  • Snoop
  • WPFPerf ванной
  • Visual Studio профилировщика
  • CLR Profiler для .NET
+2

Я боюсь, что он не подходит хорошо на веб-сайте Q & A, таком как stackoverflow. – ken2k

+0

Это не вопрос, это ответ, если кто-то ищет помощь в производительности в WPF. Я искал такой предмет примерно на месяц, и если я смогу помочь кому-либо после моего теста и исследований, я буду счастлив – mlemay

+0

I Googled WPF Performance Optimization и получил следующее http://msdn.microsoft.com/ en-us/library/aa970683.aspx http://www.michaelflanakin.com/Weblog/tabid/142/articleType/ArticleView/articleId/1015/WPF-Performance-Tips.aspx – Paparazzi

ответ

0

Это действительно комментарий, а не ответьте, но не хватает места в коммюнике.

ObservableCollection способ быстрее, чем List, показался мне инцектным, поскольку ObservableCollection реализует iList.

У меня есть список из 660 000 слов, которые я тестировал в ListView (виртуализация). Создал типы коллекций ниже и создал кнопки для переключения привязки в код позади. Все коллекции создавались мгновенно (сила виртуализации).

Переменная - это время для создания коллекции и функций, которые вам нужны из коллекции. Используется SQLdataReader для заполнения коллекции. В SQLdataReader существует изменчивость. Ран каждые 10 раз получал повторяемые результаты до 2 значащих цифр, и я сообщаю о среднем значении 3 значащих цифр. Список бит ObservableCollection составляет около 400 миллисекунд. Не измерял память, но List явно использует меньше памяти.

Milliseconds для загрузки 660 000 строк в среднем по 40 символов каждый.

1510 List 
    1780 Dictionary 
    1820 HashSet 
    1980 ObservableCollection 
    8000 SortedDictionary 

В очень большой коллекции HashSet будет лучше, чем List. HashSet должен бить Словарь - эти числа находятся в пределах изменчивости этого ограниченного нестрогового теста.

Это сводится к функциям. ObservableCollection поддерживает динамическую вставку и удаление. Если вам нужна динамическая вставка и удаление, то это, безусловно, лучший выбор. Если вам не нужна динамическая вставка и удаление, то мой опыт в том, что List является лучшим выбором (через iNotifyPropertyChanged из списка ListItem поддерживает динамическую ревизию).

В списке сохранен порядок добавления товаров. HashSet не сохраняет порядок. Многие факторы при выборе какой коллекции использовать. http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx

Оставить комментарий о времени доступа к одному элементу. Я просмотрел элементы [1], [100000], [200000], [300000], [400000], [500000], [600000] с помощью List, ObservableCollection и Dictionary. Все они были 12 мс. Время доступа было мертвым жаром и повторяемо.

+0

Я думаю, он имел в виду: «Не привязывайте List как ItemsSource к вашим ItemsControl, ObservableCollection быстрее» :) Не то, ObservableCollection сам по себе является быстрым контейнером. – dowhilefor

+0

Проблема не в загрузке, так как это будет быстрее со списком, но после этого для доступа к одному элементу в Списке он будет медленнее, чем ObservableCollection (List на 90x медленнее на данный момент) – mlemay

+0

OK Я посмотрю на время доступа к одному элементу. – Paparazzi

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