2009-02-20 25 views
18

Tôi cần xem các thuộc tính cho các thay đổi. Phương pháp nào tốt hơn về hiệu suất và sử dụng bộ nhớ: triển khai INotifyPropertyChanged hoặc sử dụng DependencyProperty?INotifyPropertyChanged vs. DependencyProperty

Lưu ý: Có, tôi đã đọc câu hỏi khác INotifyPropertyChanged vs. DependencyProperty in ViewModel.

+3

Tại sao bạn không giải thích tại sao bài viết khác không trả lời được câu hỏi của bạn hoặc điều gì làm cho câu hỏi của bạn trở nên đặc biệt? –

+1

Hiệu suất và sử dụng bộ nhớ? – Will

+0

Trong khi tôi tìm thấy câu trả lời cho bản thân mình trong một câu hỏi khác (xem câu trả lời của tôi), tôi cũng thấy câu trả lời của Rob McCready rất hữu ích, đó là lý do tôi chọn câu trả lời của anh ấy. Cảm ơn tất cả mọi người! –

Trả lời

19

Sử dụng bộ nhớ: INotifyPropertyChanged là một giao diện, vì vậy gần bằng không phí bộ nhớ. "Close to zero" vì tôi giả sử bạn sẽ viết một phương thức OnPropertyChanged và có thể một số trình xử lý sự kiện trong các lớp khác (trừ khi bạn thực sự chỉ nói về ràng buộc với WPF), vì vậy sẽ có một mã nhỏ trên đầu.

Hiệu suất: DependancyProperties có rất nhiều thứ đang diễn ra trong phần trình bày. Trừ khi bạn viết phương thức OnPropertyChanged không hiệu quả nhất, tôi sẽ cược rằng INotifyPropertyChanged sẽ là người chiến thắng hoàn hảo.

Trừ khi bạn có lý do xác định mong muốn/cần các hành vi do DP cung cấp, tôi sẽ chỉ đi với INotifyPropertyChanged.

Cập nhật

Khi bình luận đề cập đến việc ràng buộc thực hiện là một chút nhanh hơn cho người bị ảnh hưởng (15-20% nhanh hơn, nhưng vẫn chỉ là một sự khác biệt nhỏ hơn 50ms cho 1000 với phím tắt) do số lượng phản xạ cần thiết để tra cứu/móc nối các thuộc tính trực tiếp. Điều này là khác biệt về mặt kỹ thuật so với hiệu suất của việc cập nhật một phần tử giao diện người dùng databound đó là những gì nhận xét của tôi đã hướng tới. Nhưng điều đó không có nghĩa là cược của tôi vẫn đúng. Vì vậy, một vài ví dụ và rất nhiều của NET Reflector digger sau đó có vẻ ... không thuyết phục. Cả hai đường dẫn đều thực hiện một tấn công việc dưới các bìa và tôi không thể có được bất kỳ ví dụ nào để cho thấy sự khác biệt rõ ràng về hiệu suất cập nhật.

Tôi vẫn gắn bó với INotifyPropertyChanged trừ khi tôi có nhu cầu cụ thể cho DP, nhưng ít nhất là một bài tập thú vị để poke xung quanh lõi WPF một số chi tiết. :)

+3

Đặt cược của bạn có vẻ sai. Xem câu trả lời của Orion và tài liệu MSDN. DPs nhanh hơn. –

13

Không sao, tôi chỉ tìm thấy câu trả lời tôi đang tìm kiếm trong question sau đây.

tôi sẽ repost câu trả lời bằng cách "LBugnion" (vì vậy tất cả tín dụng đi với anh) thuận tiện cho bạn:


thực hiện INotifyPropertyChanged có nhiều ưu điểm so với DependencyObjects (Tôi sẽ viết tắt này DO để làm cho nó dễ dàng hơn) và sử dụng DependencyProperties (DP):

  • Đây là nhẹ hơn
  • Cho phép bạn tự do hơn trong mô hình đối tượng của bạn
  • Có thể được tuần tự hóa dễ dàng
  • Bạn có thể tăng sự kiện khi muốn, điều này có thể hữu ích trong các trường hợp nhất định, ví dụ: khi bạn muốn gộp nhiều thay đổi chỉ trong một thao tác UI hoặc khi bạn cần tăng sự kiện ngay cả khi dữ liệu không thay đổi (để buộc vẽ lại ...)

Mặt khác, kế thừa Dos trong WPF có các ưu điểm sau:

  • dễ dàng hơn để thực hiện đặc biệt dành cho người mới bắt đầu.
  • Bạn nhận được cơ chế gọi lại (gần như) miễn phí, cho phép bạn được thông báo khi giá trị thuộc tính thay đổi
  • Bạn có cơ chế cưỡng chế cho phép xác định quy tắc cho giá trị tối đa, tối thiểu và hiện tại của thuộc tính.

Có những cân nhắc khác, nhưng đây là những cân nhắc chính. Tôi nghĩ rằng sự đồng thuận chung là DPs là tuyệt vời cho điều khiển (và bạn có thể thực hiện một CustomControl với DP tùy chỉnh ngay cả trong Silverlight), nhưng đối với các đối tượng dữ liệu bạn nên thực hiện INotifyPropertyChanged.

HTH, Laurent

1

IMHO, INotifyPropertyChanged là rất nhẹ và dễ sử dụng hơn so với người bị ảnh hưởng. Theo như hiệu suất/bộ nhớ có liên quan, bạn có cần thực sự không? Knuth muốn biết.

Rõ ràng, bạn phải xác định yêu cầu của mình và xem bạn muốn tạo bao nhiêu DP/giây, thời gian tồn tại của chúng và chạy một vài thử nghiệm. Tôi đã thực hiện điều này trước đây và không thấy bất kỳ vấn đề nào với việc tạo ra thời gian sống ngắn của DP ở ~ 10k/giây (YMMV).

1

Tôi khuyên bạn nên đặt câu hỏi sai. Thay vì hỏi về hiệu suất, bạn nên xem xét các tính năng và lợi ích của từng phương pháp. Về cơ bản, quyết định sử dụng không nên dựa trên hiệu suất. Từ bit đọc tôi đã thực hiện nếu bạn đang tạo một điều khiển thì bạn nên sử dụng dependencyProperty, nếu không sử dụng INotifyPropertyChanged.

+0

Nó không phải là cách đơn giản như vậy: Kiểm soát - DP, nếu không - INotifyPropertyChanged. Ví dụ, chúng ta kế thừa từ ModelVisual3D (vì vậy tôi có thể thực hiện một DP) trong lớp đồ họa 3D. Tôi đang quan tâm đến công việc nhanh chóng của các trường hợp lớp học của tôi trên cảnh 3D. Ngoài ra, tôi có thể kế thừa từ FrameworkElement bất kỳ lớp học nào của tôi để triển khai DP. Một điều tôi quan tâm trong mọi trường hợp - hiệu suất! –

1

Đây là câu hỏi rất thú vị và quan trọng IMHO. Tôi đã thử nghiệm nó trên công việc tinh khiết tiếp theo (không ràng buộc). DP là một thực tế cần phải hết sức nhanh ... (100 .. thuộc tính của mỗi tiêu chuẩn kiểm soát, animatable) Vì vậy, vấn đề là

Giả 3D trục tọa độ. Chúng tôi đặt một nhãn như x, yz gần mỗi trục. Hiển thị văn bản 3D trong WPF là công việc tương đối khó khăn WPF 3D Perfomance

Nhiệm vụ là xoay nhãn được phát hiện khi quay chuột trong cảnh 3D bằng cách khi nhãn có chế độ xem trực tiếp tới người dùng (Xoay cảnh 3D họ đang dịch bằng trục nhưng quay cách đặc biệt). Tác vụ này được giải quyết bằng cùng chức năng CallBack. Thực hiện trông như thế này:

  1. Tiếp cận - INotifyPropertyChanged bao gồm)

    Công T3D_LabelAngleX tuệ() Như đúp Nhận Return _T3D_LabelAngleX Cuối Get Set (giá trị ByVal Như Đôi) _T3D_LabelAngleX = giá trị t3d_SetLabelTransform() End Set End Property

  2. Tiếp cận - DP

    Công Shared ReadOnly MDS_AngleLabelRotation_XProperty Như DependencyProperty = _ DependencyProperty.Register ("MDS_AxisAngleRotation_X", _ GetType (Double), GetType (MainDecartsSystem), _ New 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 
    

    Trọng tâm là MDS_RotationChangedt3d_SetLabelTransform()bằng. Labels in rotation.... Chuột nghèo của tôi .... Cả hai đều rất nhanh! Tôi không thể phát hiện bất kỳ sự khác biệt nào. Dường như DP nhanh hơn một chút, có lẽ ... (Tôi không chắc). Cảm ơn câu hỏi.

Các vấn đề liên quan