首页 文章

DynamicResource而不是StaticResource是否有显着的性能成本?

提问于
浏览
14

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

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

这是一个很好的SO问题,解释了类型之间的区别:What's the difference between StaticResource and DynamicResource in WPF?

3 回答

  • 5

    不幸的是,如果您将动态资源更改回静态,它将破坏Blend . 这似乎是真的,尤其是在使用引用动态资源的UserControl时,如果将它们更改为静态,则在Blend中的另一个控件内托管时控件将不会呈现 .

  • 1

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

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

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

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

  • 28

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

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

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

相关问题