DynamicResource而不是StaticResource是否会产生显着的性能成本?

sco*_*obi 16 wpf performance resources dynamicresource staticresource

我们的设计师使用Blend来设计我们的WPF应用程序.当他选择属性的本地资源时,Blend会将它们应用为{DynamicResource}而不是a {StaticResource}.我的猜测是Blend这样做是因为它使应用程序能够在运行时重新设置主题而无需重新启动它.

我的问题是:这个额外的查找是否有显着的性能成本?我们是否应该要求设计人员返回并手动将这些动态更改为静态?

这是一个很好的SO问题,解释了类型之间的区别:WPF中StaticResource和DynamicResource之间的区别是什么?

Joh*_*wen 30

不幸的是,这是一个很难直接比较相对性能的情况,因为任何降级都会出现在WPF引擎的深处.在WPF的早期阶段,StaticResource的使用是推荐的标准性能调整之一,我们倾向于在我们的组织中非常严格地遵循它并将其推荐给其他人.我真的很恼火Blend做了动态的一切,尽管这有助于它在设计时正确地从其他文件中提取资源.

随着时间的推移,我对此的看法发生了变化,这在某种程度上取决于个人经验,但也有来自微软Blend团队成员的反馈.您可能已经意识到,Blend完全用WPF编写,并且具有完整的备用主题(Light),可以在应用程序运行时动态切换.这是可能的,因为他们使用DynamicResource来完成他们的所有样式.据他们说,这并没有真正导致他们任何真正的性能问题.鉴于Blend可能是现存最广泛使用的WPF应用程序,我倾向于对其观点给予重视.

另外要考虑的是DynamicResource的实际用途.动态更改样式的能力是其中的一部分,但是它在构建资源层次结构时提供的灵活性可以使管理共享样式变得更加容易.我确定你遇到了StaticResource引用在运行时爆炸的情况,因为它指向的资源要加载到层次结构的不同分支中.

显然,StaticResource对于指向您知道将在适当的时间可用的特定密钥非常有用.当手写XAML时,我仍然倾向于一直使用它.但是考虑到设计师在Blend中生成XAML所带来的工作效率,您可能获得的任何小的性能提升可能都不值得将所有内容维护为静态.


ito*_*son 6

据说有性能差异,但它是否"重要"将取决于发生了多少动态查找.除非你有成千上万的DynamicResource引用,否则它可能不会引人注目; 如果动态资源的表现比静态资源差得多,我怀疑Blend会更加保守地生成它们.

实际上,当我运行一个天真的测试时,我发现DynamicResource 比StaticResource 运行得更快的反直觉结果(有3000个资源引用,当我使用DynamicResource进行一切时,我看到加载时间大约为200ms,而StaticResource大约为400ms).

这是一个不切实际的测试,原因有很多:所有引用都是相同的,我在调试器下运行等等.但它表明,为了以防万一,努力改变Blend输出还为时过早 - - 如果你注意到减速,它可能不一定是DynamicResource引用的错误 - 总是测量!