2012-03-22 30 views
5

Tôi đã tạo danh sách tất cả mọi thứ có thể giúp cải thiện hiệu suất trong một ứng dụng rất phức tạp với rất nhiều điều khiển. Nếu bạn muốn thêm của bạn, chào đón của bạn!Giải quyết vấn đề về hiệu suất với ứng dụng WPF

  • Nếu bạn biết kích thước của sự kiểm soát, loại bỏ các Auto và nhập giá trị thực, do đó cha mẹ không nhất thiết phải phân tích tất cả Childs để kiểm tra kích thước ông cần
  • Cài đặt thông số IsHitTestVisible = False nếu phần tử không cần phải tương tác
  • Freeze tất cả các đối tượng mà bạn có thể
  • sử dụng nguồn lực tĩnh thay vì các nguồn tài nguyên động
  • không sử dụng các đối tượng Ellipse, biến đổi Ellipse để một con đường
  • Don không sử dụng TextBox hoặc Label nếu bạn có thể sử dụng một TextBlock
  • Sử dụng Canvas thay vì lưới khi có thể
  • Không FlowDocument
  • Ảo hóa !! VirtualizingStackPanel thay vì StackPanel
  • Không sử dụng List, ObservableCollection là cách nhanh hơn
  • Sử dụng các thư viện Vẽ, đó là nhanh hơn sau đó thư viện Shapes
  • Kiểm tra ràng buộc của bạn! Nếu một ràng buộc không hoạt động, nó có thể rất chậm
  • Không sử dụng Visibility.Hidden, sử dụng Visibility.Collapsed khi bạn có thể
  • DependencyProperty là 3x nhanh hơn sau đó INotifyPropertyChanged
  • StreamGeometry là nhanh hơn sau đó PathGeometry
  • Xử lý sự kiện rõ ràng khi bạn đã thực hiện với họ!
  • Không sử dụng tài sản Object Opacity, nếu bạn có thể, sử dụng opacity màu mình
  • Kiểm tra xem ứng dụng của bạn là phần cứng render (Tier-2)
  • Giảm kích thước/chất lượng của hình ảnh của bạn khi bạn có thể
  • Hình ảnh hiển thị là cách nhanh hơn rồi hiển thị vector!

cụ mà tôi sử dụng:

  • WPF Inspector
  • Snoop
  • WPFPerf bộ
  • Visual Studio profiler
  • CLR Profiler cho .NET
+2

Tôi e rằng nó không phù hợp với trang web Hỏi & Đáp như stackoverflow. – ken2k

+0

Nó không phải là một câu hỏi, đó là một câu trả lời nếu ai đó đang tìm kiếm sự trợ giúp về hiệu năng trong WPF. Tôi đã tìm kiếm một chủ đề như thế này trong khoảng một tháng và nếu tôi có thể giúp một ai đó sau tất cả thử nghiệm và nghiên cứu của tôi, tôi sẽ hạnh phúc – mlemay

+0

Tôi đã tối ưu hóa hiệu suất WPF của Google và nhận được 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

Trả lời

0

Đây là thực sự là một bình luận và không phải là một trả lời nhưng không đủ không gian trong cam kết.

Quan sátCách nhanh hơn Danh sách dường như phản đối trực quan với tôi khi ObservableCollection triển khai iList.

Tôi có danh sách 660.000 từ mà tôi đã thử nghiệm trên một ListView (ảo hóa). Đã tạo các loại bộ sưu tập bên dưới và tạo các nút để chuyển đổi ràng buộc trong mã phía sau. Tất cả các bộ sưu tập được hiển thị ngay lập tức (sức mạnh của ảo hóa).

Biến là thời gian để tạo bộ sưu tập và tính năng bạn cần từ bộ sưu tập. Đã sử dụng SQLdataReader để điền tập hợp. Có sự thay đổi trong SQLdataReader. Đã chạy mỗi 10 lần có kết quả lặp lại thành 2 chữ số có nghĩa và tôi báo cáo trung bình là 3 chữ số có nghĩa. Danh sách đánh bại ObservableCollection khoảng 400 mili giây. Không đo được bộ nhớ nhưng Danh sách rõ ràng sẽ sử dụng ít bộ nhớ hơn.

Mili giây để tải 660.000 chuỗi trung bình khoảng 40 ký tự mỗi.

1510 List 
    1780 Dictionary 
    1820 HashSet 
    1980 ObservableCollection 
    8000 SortedDictionary 

Trong bộ sưu tập rất lớn, HashSet sẽ tốt hơn Danh sách. HashSet nên đánh bại từ điển - những con số này nằm trong sự thay đổi của bài kiểm tra không nghiêm ngặt này.

Tính năng này có tính năng. ObservableCollection hỗ trợ chèn và xóa động. Nếu bạn cần chèn động và xóa thì nó là lựa chọn tốt nhất. Nếu bạn không cần chèn động và xóa thì kinh nghiệm của tôi là Danh sách là một lựa chọn tốt hơn (thông qua iNotifyPropertyChanged của ListItem List hỗ trợ sửa đổi động).

Danh sách lưu giữ thứ tự các mục được thêm vào. HashSet không giữ lại thứ tự. Nhiều yếu tố trong việc chọn bộ sưu tập để sử dụng. http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx

Đã có nhận xét về thời gian truy cập vào một mục duy nhất. Tôi đã truy cập các mục [1], [100000], [200000], [300000], [400000], [500000], [600000] bằng Danh sách, ObservableCollection và Từ điển. Tất cả đều là 12 ms. Thời gian truy cập là nhiệt chết và có thể lặp lại.

+0

tôi nghĩ rằng ông có nghĩa là: "Không ràng buộc một danh sách như ItemsSource để ItemsControl của bạn, ObservableCollection là cách nhanh hơn" :) Không phải là ObservableCollection chính nó là một container nhanh. – dowhilefor

+0

Vấn đề không được tải, ok nó sẽ nhanh hơn với Danh sách, nhưng sau đó để truy cập vào một phần tử trong Danh sách, nó chậm hơn ObservableCollection (Danh sách chậm hơn 90x vào thời điểm này) – mlemay

+0

OK Tôi sẽ xem xét thời gian truy cập vào một phần tử duy nhất. – Paparazzi

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