2012-01-11 39 views
18

Chúng tôi có một ứng dụng C# WPF được viết bằng .Net 4.0, một số chức năng liên kết dữ liệu và lưới tương đối đơn giản.WPF C# Hiệu suất ứng dụng

Kiểu tạo nên một vài 'chỉnh sửa', bao gồm một số màu di chuột và v.v.

Trên 3 máy, ngoài triển khai bao gồm 20, chúng tôi đang gặp phải một số vấn đề về hiệu suất rất lạ với giao diện người dùng.

Có hiệu quả, sau khi khởi động lại ứng dụng hoạt động tốt, nhưng sau một khoảng thời gian nhất định (không xác định), giao diện người dùng trở nên cực kỳ chậm chạp. Ví dụ: di chuột qua nút và sẽ có sự chậm trễ tới vài giây trước khi kiểu dáng di chuột được áp dụng/hiển thị.

Máy có các thông số kỹ thuật gần như giống hệt nhau. Các trình điều khiển đồ họa đã được cập nhật và thiết lập starndard là hai thẻ NVIDIA Quadro 290. Additoinally, chúng tôi đã thực hiện một ứng dụng 'thử nghiệm' có chứa một số thành phần UI thử nghiệm (bao gồm cả Fluent Ribbon) và không có mã phía sau. Vấn đề vẫn xảy ra.

Tôi đã chạy Windows Performance Suite để 'lặn sâu' WPF thời gian chạy, và, rất lạ, giao diện người dùng trả về mức phản hồi bình thường nếu tùy chọn 'Tắt hỗ trợ vùng bẩn' được chọn. Sự hiểu biết của tôi là, nếu có, điều này sẽ làm giảm hiệu suất hơn nữa !!!

Tôi đang mất mọi thứ khác để thử ở đây. Một phân tích hiệu suất DotTrace cho thấy hầu hết thời gian ứng dụng được chi tiêu trong PresentationFramework.dll.

[EDIT] Tất cả các máy đều là Windows XP SP3.

[EDIT] Có thể điều này xảy ra trên tất cả các máy và ứng dụng thường không được phép chạy đủ lâu để trình bày sự cố. Chúng tôi đang thử nghiệm điều này ngay bây giờ.

[EDIT] Tôi cũng nên chỉ ra rằng chúng tôi đang thử nghiệm với hotfix chi tiết here. Nó đã được cài đặt trên một máy tính cho thời điểm này, và tôi sẽ cập nhật cho phù hợp.

[EDIT - 24 giờ sau] Vì vậy, hai máy hiện đang chạy cùng một mã qua đêm. Trên máy tính của tôi (mà chưa bao giờ chứng minh được vấn đề), sau khi đăng nhập ban đầu trong ứng dụng rất chậm chạp, nhưng sau chưa đầy một phút trở lại bình thường. (Tôi đặt nó xuống máy rõ ràng kéo mọi thứ ra khỏi ổ cứng). Trên một máy khác (thường thể hiện vấn đề), ứng dụng được cải thiện sau vài giây, nhưng hiện nay vẫn còn chậm chạp so với tôi.

[EDIT - 48 giờ sau] Trên máy thử nghiệm, ứng dụng thử nghiệm hiện đã hoàn toàn không phản hồi (bị khóa) sau khi chạy trong 48 giờ. Trên cùng một máy, một ứng dụng WPF 'vỏ' nhẹ (có chứa một điều khiển tab, một số nút và một vài tấm và lưới) vẫn đang chạy và đáp ứng hoàn toàn. Vì vậy, một cái gì đó trong các điều khiển phức tạp hơn là gây ra vấn đề này ... mà thực sự chỉ trở lại (tiềm năng) gây nên và đại biểu có thể là nguyên nhân gốc rễ. Tôi sẽ xem xét hồ sơ ứng dụng/điều khiển một lần nữa. Trong thời gian có nghĩa là bất cứ ai có bất cứ lời khuyên nào về cách đảm bảo rằng ứng dụng 'dọn sạch' sau chính nó trong khoảng thời gian đều đặn? Vì chúng tôi đang xem xét các điều khiển của bên thứ ba ở đây nên các tùy chọn chỉnh sửa của chúng tôi bị giới hạn!

Sẽ đánh giá cao mọi mẹo có thể được cung cấp!

+0

Có thể cung cấp mã không? một số SO'er khác có lẽ sẽ muốn thử điều này là tốt. Thời gian ít nhất là bao lâu trước khi các sự cố xuất hiện? – Default

+0

Tôi có thể cung cấp mã nếu cần thiết ... nhưng ứng dụng thử nghiệm của chúng tôi tại thời điểm này nghĩa là sử dụng CHỈ một Băng thông thạo (có thể tải xuống từ CodePlex), trong và lưới trống. Không có mã nào khác ngoài lời gọi init rõ ràng. Tất nhiên tôi sẽ cung cấp cho bạn điều này nếu nó sẽ làm cho cuộc sống dễ dàng hơn. – Nick

+0

Đừng mong đợi nhiều từ một hệ thống nguyên mẫu. Bước đầu tiên tôi muốn kiểm tra việc sử dụng đại biểu là gì. Bạn có thường xuyên sử dụng không? –

Trả lời

2

cố gắng hiển thị wpf ở chế độ phần mềm.

trong sự kiện Loaded:

HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; 
HwndTarget hwndTarget = hwndSource.CompositionTarget; 
hwndTarget.RenderMode = RenderMode.SoftwareOnly; 
+0

Tôi đã thử điều này. Tôi nên chỉ ra rằng vấn đề vẫn tồn tại trên một ứng dụng khởi động lại. Vì vậy, nếu nó chậm chạp, tôi đã thử xây dựng lại nó với cờ SoftwareOnly, triển khai nó vào máy mục tiêu, và nó vẫn còn chậm chạp. Chỉ có một khởi động lại cấp một cải tiến! – Nick

+0

Fluent Ribbon có sử dụng các cửa sổ nhiều lớp không? xem: http://blogs.msdn.com/b/seema/archive/2006/09/18/761314.aspx http://blogs.msdn.com/b/seema/archive/2007/07/ 02/hw-acceleration-of-layered-windows-good-news.aspx – c0d1ng

+0

có thể đang phát bằng một số cài đặt đăng ký: http://msdn.microsoft.com/en-us/library/aa970912.aspx – c0d1ng

1

cái gì đó để xem xét khi so sánh hiệu suất giữa nhà phát triển và người dùng máy là thời gian cần thiết để tải các hội đồng WPF.

Trên máy tính cá nhân bạn có thể đã chạy studio trực quan hoặc trước đó đã chạy các ứng dụng WPF khác và các hội đồng nên được tải vào thời điểm bạn chạy ứng dụng của mình.

Trên máy người dùng, có thể mới được khởi động lại, các hội đồng sẽ được tải khi ứng dụng được khởi động, giúp khởi động chậm hơn đáng kể. Tùy thuộc vào cách ứng dụng được thiết lập có thể có các hội đồng bổ sung tải khi các tính năng/trang khác nhau được sử dụng lần đầu tiên.

Tôi đã tìm thấy EQUATEC profiler hữu ích trong việc gỡ lỗi các vấn đề về hiệu suất này. Thay đổi cấu hình thành "Thông tin đầy đủ thông thường" trong các tùy chọn ứng dụng trước khi xây dựng dự án của bạn sẽ giảm xuống mức ràng buộc.

+1

Tôi không thực sự tin rằng đây là để làm với thời gian khởi động và lắp ráp sẵn. Đây là khoảng thời gian dài trong vòng đời của ứng dụng. Tôi đã điều tra các vấn đề liên quan đến khởi động khác nhau như đã đề cập tại http://blogs.msdn.com/b/jgoldb/archive/2007/10/10/improving-wpf-applications-startup-time.aspx – Nick

+0

Ngoài ra, tôi đã chạy Procmon cùng với ứng dụng và đã nhận thấy không tải tệp trong khi hoạt động bình thường (và trong khi giao diện người dùng bị trễ). Tôi chắc chắn sẽ cung cấp cho các hồ sơ EQUATEC đi anyway mặc dù! – Nick

+0

Cảm ơn bạn đã liên kết, rất nhiều thứ mà tôi đã tự hỏi trong đó (ví dụ: đặt các cụm từ có tên mạnh trong GAC "để khởi động nhanh hơn) – Skrealin

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