Существуют ли значительные затраты производительности для DynamicResource вместо StaticResource? - PullRequest
16 голосов
/ 12 февраля 2010

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

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

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

Ответы [ 3 ]

30 голосов
/ 12 февраля 2010

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

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

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

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

6 голосов
/ 12 февраля 2010

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

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

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

1 голос
/ 12 февраля 2010

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

...