2010-02-12 20 views
14

Nhà thiết kế của chúng tôi đang sử dụng Blend để tạo kiểu cho ứng dụng WPF của chúng tôi. Khi anh ta chọn các tài nguyên cục bộ cho các thuộc tính, Blend sẽ áp dụng chúng như là một {DynamicResource} thay vì một {StaticResource}. Tôi đoán là Blend làm điều này bởi vì nó cho phép ứng dụng được tái theo chủ đề tại thời gian chạy mà không cần phải khởi động lại nó.Có chi phí hiệu năng đáng kể nào cho DynamicResource thay vì StaticResource không?

Câu hỏi của tôi là: có chi phí hiệu suất đáng kể cho lần tra cứu bổ sung này không? Chúng tôi có nên yêu cầu nhà thiết kế quay trở lại và thay đổi các Dynamics thành Statics theo cách thủ công không?

Đây là một câu hỏi lớn SO giải thích sự khác biệt giữa các loại: What's the difference between StaticResource and DynamicResource in WPF?

Trả lời

25

Thật không may đây là trường hợp rất khó để so sánh trực tiếp hiệu suất tương đối kể từ khi có bất kỳ sự xuống cấp nào xuất hiện sâu trong công cụ WPF. Trong những ngày đầu của WPF, việc sử dụng StaticResource là một trong những thay đổi điều chỉnh hiệu năng tiêu chuẩn đã được đề xuất và chúng tôi có xu hướng theo dõi nó khá nghiêm ngặt trong tổ chức của chúng tôi và giới thiệu nó cho người khác. Tôi đã thực sự khó chịu rằng Blend đã làm tất cả mọi thứ động mặc dù đã giúp nó để render tài nguyên từ các tập tin khác đúng lúc thiết kế.

Theo thời gian, quan điểm của tôi về điều này đã thay đổi, một phần do trải nghiệm cá nhân, nhưng cũng phản hồi từ những người trong nhóm Blend tại Microsoft. Như bạn có thể biết, Blend được viết hoàn toàn trong WPF và có một chủ đề thay thế hoàn toàn (Light) có thể được bật khi đang chạy trong khi ứng dụng đang chạy. Điều này là có thể bởi vì họ đã sử dụng DynamicResource cho khá nhiều kiểu dáng của họ. Theo họ, điều này đã không thực sự gây ra cho họ bất kỳ vấn đề thực sự perf. Cho rằng Blend có lẽ là ứng dụng WPF được sử dụng rộng rãi nhất trong sự tồn tại, tôi có xu hướng để cung cấp cho trọng lượng đáng kể cho quan điểm của họ.

Điều khác cần xem xét là tính hữu dụng thực tế của DynamicResource. Khả năng thay đổi kiểu dáng khi đang bay là một phần của nó, nhưng sự linh hoạt mà nó mang lại cho bạn trong việc xây dựng hệ thống phân cấp tài nguyên của bạn có thể giúp bạn quản lý các kiểu được chia sẻ dễ dàng hơn nhiều. Tôi chắc rằng bạn đã chạy vào một tình huống mà một tham chiếu StaticResource sẽ bị gián đoạn trong thời gian chạy vì tài nguyên mà nó trỏ đến sẽ được nạp vào một nhánh khác của hệ thống phân cấp.

Rõ ràng StaticResource rất hữu ích khi trỏ đến một khóa cụ thể mà bạn biết sẽ khả dụng vào đúng thời điểm. Khi viết tay XAML tôi vẫn có xu hướng sử dụng nó mọi lúc. Nhưng với năng suất bạn kiếm được từ việc một nhà thiết kế tạo ra XAML của bạn trong Blend, bất kỳ hiệu năng nhỏ nào mà bạn có thể nhận được có lẽ không đáng để làm việc với mọi thứ như Static.

+0

Về câu lệnh của bạn "Rõ ràng StaticResource rất hữu ích cho việc trỏ đến một khóa cụ thể bạn biết là sẽ có sẵn vào đúng thời điểm. " Điều này có nghĩa là một DynamicResource mất kiểm tra kiểu thời gian biên dịch và được chuyển sang thời gian chạy không? – scobi

+0

Có. Trong hầu hết các trường hợp, tham chiếu DynamicResource không được giải quyết sẽ chỉ nhận được một giá trị mặc định (như Black for Brushes) và chờ xung quanh cho khóa mà nó đang tìm kiếm để hiển thị. Không có cách nào thực sự cho trình biên dịch xác nhận tình huống đó một mình. –

+0

Điều đó rất hữu ích, cảm ơn !! –

5

Có được cho là một sự khác biệt hiệu suất, nhưng cho dù đó là "đáng kể" sẽ phụ thuộc vào có bao nhiêu tra cứu động đang xảy ra. Trừ khi bạn có hàng ngàn tài liệu tham khảo DynamicResource, nó có thể sẽ không đáng chú ý theo cách nào cả; nếu các tài nguyên động thực hiện tồi tệ hơn nhiều so với các tài nguyên tĩnh, tôi nghi ngờ Blend sẽ bảo thủ hơn khi tạo ra chúng. Trong thực tế, khi tôi chạy một thử nghiệm ngây thơ, tôi thấy kết quả phản trực giác là DynamicResource chạy nhanh hơn hơn StaticResource (với 3000 tài nguyên tham khảo, tôi thấy thời gian tải khoảng 200ms khi tôi sử dụng DynamicResource cho mọi thứ so với khoảng 400 mili giây cho StaticResource).

Đây là một thử nghiệm không thực tế vì nhiều lý do: tất cả các tham chiếu đều giống nhau, tôi đang chạy dưới trình sửa lỗi, v.v. Nhưng nó cho thấy sẽ rất sớm để đưa nỗ lực vào việc thay đổi đầu ra Blend " trong trường hợp "- và nếu bạn nhận thấy sự chậm lại, nó có thể không nhất thiết phải là lỗi của tham chiếu DynamicResource - luôn luôn đo lường!

+1

Tôi nghĩ rằng DynamicResouces được tải trên một chuỗi backgrond và chỉ được tải khi mục sử dụng chúng trở nên vissible, do đó, làm cho việc kiểm tra tốc độ rất khó –

1

Thật không may nếu bạn thay đổi tài nguyên động trở về trạng thái tĩnh, nó sẽ phá vỡ Blend. Điều này có vẻ đúng, đặc biệt là khi sử dụng UserControls tham chiếu tài nguyên động, nếu bạn thay đổi chúng thành tĩnh thì điều khiển sẽ không hiển thị khi được lưu trữ bên trong một điều khiển khác trong Blend.