Есть ли значительные затраты на производительность для DynamicResource вместо StaticResource?

StackOverflow https://stackoverflow.com/questions/2248904

Вопрос

Наш дизайнер использует Blend для оформления нашего приложения WPF.Когда он выберет локальные ресурсы для свойств, Blend применит их в качестве {DynamicResource} вместо того , чтобы {StaticResource}.Я предполагаю, что Blend делает это потому, что позволяет изменять тематику приложения во время выполнения без необходимости его перезапуска.

Мой вопрос заключается в следующем:есть ли значительные затраты на производительность при таком дополнительном поиске?Должны ли мы попросить дизайнера вернуться назад и вручную изменить эту Динамику на статику?

Вот отличный вопрос SO, который объясняет разницу между типами: В чем разница между StaticResource и DynamicResource в WPF?

Это было полезно?

Решение

К сожалению, это тот случай, когда очень сложно провести прямое сравнение относительной производительности, поскольку место, где проявилось бы любое ухудшение, находится глубоко в движке WPF.На заре WPF использование StaticResource было одним из рекомендованных стандартных изменений в настройке производительности, и мы, как правило, довольно строго следовали ему в нашей организации и рекомендовали его другим.Я был действительно раздражен тем, что Blend делал динамическим все, даже несмотря на то, что это помогало ему правильно отображать ресурсы из других файлов во время разработки.

Со временем мой взгляд на это изменился, в некоторой степени благодаря личному опыту, а также отзывам людей из команды Blend в Microsoft.Как вы, вероятно, знаете, Blend полностью написан на WPF и имеет полную альтернативную тему (Light), которую можно переключать "на лету" во время работы приложения.Это возможно, потому что они использовали DynamicResource практически для всех своих стилей.По их словам, на самом деле это не вызвало у них никаких реальных проблем с производительностью.Учитывая, что Blend, вероятно, является наиболее широко используемым приложением WPF из всех существующих, я склонен придавать значительный вес их взглядам.

Еще одна вещь, которую следует учитывать, - это фактическая полезность DynamicResource .Возможность изменять стиль "на лету" - это одна из его частей, но также гибкость, которую он дает вам при построении иерархии ресурсов, может значительно упростить управление общими стилями.Я уверен, что вы сталкивались с ситуацией, когда ссылка на StaticResource прерывалась во время выполнения, потому что ресурс, на который она указывала, должен был быть загружен в другую ветвь иерархии.

Очевидно, что StaticResource очень полезен для указания на конкретный ключ, который, как вы знаете, будет доступен в нужное время.При написании XAML от руки я по-прежнему склонен использовать его постоянно.Но, учитывая производительность, которую вы получаете от того, что дизайнер генерирует ваш XAML в Blend, любой небольшой прирост производительности, который вы могли бы получить, вероятно, не стоит затрат на ручное поддержание всего в статическом состоянии.

Другие советы

Говорят, что существует разница в производительности, но является ли она "существенной", будет зависеть от того, сколько выполняется динамических поисков.Если у вас нет тысяч ссылок на DynamicResource, это, вероятно, не будет заметно в любом случае;если бы динамические ресурсы работали намного хуже, чем статические, я подозреваю, что Blend был бы более консервативен в их создании.

Фактически, когда я запустил наивный тест, я обнаружил нелогичный результат, который выдал DynamicResource быстрее чем StaticResource (с 3000 ссылками на ресурсы, я видел время загрузки около 200 мс, когда я использовал DynamicResource для всего, по сравнениюоколо 400 мс для StaticResource).

Это был нереалистичный тест по многим причинам:все ссылки были на одно и то же, я работал под управлением отладчика и т.д.и т.д.Но это говорит о том, что было бы преждевременно прилагать усилия к изменению выходных данных Blend "на всякий случай" - и что если вы заметите замедление, это не обязательно может быть ошибкой ссылок на DynamicResource - всегда измеряйте!

К сожалению, если вы измените динамические ресурсы обратно на статические, это нарушит смешивание.Это кажется верным, особенно при использовании пользовательских элементов управления, которые ссылаются на динамические ресурсы, если вы измените их на статические, элемент управления не будет отображаться при размещении внутри другого элемента управления в Blend.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top