2009-02-20 2 views
18

Мне нужно посмотреть свойства для изменений. Какой метод лучше с точки зрения производительности и использования памяти: внедрение INotifyPropertyChanged или использование DependencyProperty?INotifyPropertyChanged или DependencyProperty

Примечание: Да, я прочитал другой вопрос INotifyPropertyChanged vs. DependencyProperty in ViewModel.

+3

Почему бы вам не объяснить, почему другая статья не предоставила вам ваш ответ или что делает ваш вопрос особенным? –

+1

Производительность и использование памяти? – Will

+0

Когда я нашел ответ сам по другому вопросу (см. Мой ответ), я также нашел ответ Роба Маккриди очень полезным, и именно поэтому я выбрал его ответ и дал ему большие пальцы. Спасибо всем! – 2009-02-20 18:26:49

ответ

19

Использование памяти: INotifyPropertyChanged - это интерфейс, который близок к нулевому объему памяти. «Близко к нулю», поскольку я предполагаю, что вы будете писать метод OnPropertyChanged и, возможно, некоторые обработчики событий в других классах (если только вы не просто говорите о привязке к WPF), значит, накладные расходы будут незначительными.

Производительность: DependancyProperties много происходит под обложками. Если вы не напишете самый неэффективный метод OnPropertyChanged, я бы сделал ставку на то, что INotifyPropertyChanged также станет победителем.

Если у вас нет определенной причины для желания/необходимости поведения, предоставляемого DP, я бы просто пошел с INotifyPropertyChanged.

Обновление

Как комментарий упоминает связывание производительность немного быстрее для DPs (15-20% быстрее, но все же лишь разницей менее 50 мс на 1000 привязок) из-за количества, необходимого отражения к поиску/подключению прямых свойств. Это технически отличается от производительности по обновлению элемента пользовательского интерфейса с привязкой к базе данных, к чему привязывался мой комментарий. Но это не значит, что моя ставка все еще правильна. Таким образом, несколько примеров и много инструментов .NET Reflector digger позже выглядят ... неубедительными. Оба пути делают тонну работы под обложками, и я не смог получить никаких примеров, чтобы показать окончательную разницу в производительности обновления.

Я по-прежнему придерживаюсь INotifyPropertyChanged, если у меня нет конкретной потребности в DP, но это было, по крайней мере, интересное упражнение, чтобы еще больше засунуть в ядро ​​WPF. :)

+3

Ваша ставка кажется неправильной. См. Ответ Ориона и документы MSDN. DP быстрее. –

13

Ничего, я только что нашел ответы, которые я искал в следующих question.

Я перепечатывать ответ на «LBugnion» (так все заслуга к нему) для вашего удобства:


Реализация INotifyPropertyChanged имеет много преимуществ по сравнению с DependencyObjects (я сокращайте это сделать, чтобы сделать его проще) и с использованием DependencyProperties (DPS):

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

с другой стороны, наследуя-дус в WPF имеют следующие преимущества:

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

Есть и другие соображения, но они являются основными.

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

НТН, Лоран

1

ИМХО, INotifyPropertyChanged очень легкий и простой в использовании по сравнению с ДПС. Что касается производительности/памяти, то вам нужно знать ? Кнут хочет знать.

Очевидно, что вам необходимо определить ваши требования и посмотреть, сколько DP вы ожидаете создать/секунду, как долго они живут, и провести несколько тестов. Я делал это раньше и не видел проблем с созданием недолговечных DP на скорости ~ 10 к/сек (YMMV).

1

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

+0

Это не так просто: Control - DP, иначе - INotifyPropertyChanged. Например, мы наследуем модель ModelVisual3D (так что я могу реализовать DP) в классе 3D Graphics. Я заинтересован в быстрой работе экземпляров моего класса на 3D-сцене. Кроме того, я могу наследовать от FrameworkElement любой мой класс для реализации DP. Единственное, что меня интересует во всех случаях - производительность! –

1

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

Предположим 3D координатных осей. Мы ставим метки как х, у и г вблизи каждой оси. 3D-рендеринг текста в WPF - относительно тяжелая работа WPF 3D Perfomance

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

  1. подход - INotifyPropertyChanged включает в себя)

    Public T3D_LabelAngleX Property() As Double Получить Вернуться _T3D_LabelAngleX End Get Set (значение ByVal As Double) _T3D_LabelAngleX = значение t3d_SetLabelTransform() Конечный набор Конечное имущество

  2. подход - DP

    Public Shared ReadOnly MDS_AngleLabelRotation_XProperty Как DependencyProperty = _ DependencyProperty.Register ("MDS_AxisAngleRotation_X", _ GetType (Double), GetType (MainDecartsSystem), _ Новый PropertyMetadata (MDS_AngleLabelRotation_XDefault, AddressOf MDS_RotationChanged))

    Public Property MDS_AngleLabelRotation_X() As Double 
        Get 
         Return CType(GetValue(MDS_AngleLabelRotation_XProperty), Double) 
        End Get 
        Set(ByVal value As Double) 
         SetValue(MDS_AngleLabelRotation_XProperty, value) 
        End Set 
    End Property 
    

    фокус MDS_RotationChanged и t3d_SetLabelTransform() являются равны. Labels in rotation.... Моя бедная мышь .... ОБА очень БЫСТРО! Я не мог обнаружить никакой разницы. Кажется, что DP немного быстрее, наверное ... (я не уверен). Спасибо за вопрос.

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