【发布时间】:2011-08-13 00:29:06
【问题描述】:
我有一个 WPF 应用程序,但速度很慢。
不是渲染。首先,渲染很简单,其次,我用 WPF Performance Toolkit 看了一下 - 什么都没有。
在我自己的代码中不是。首先,单元测试运行很快,其次,如果我将所有 DataTemplate 替换为空白,一切运行很快。
到目前为止,看起来缓慢的部分是模板实例化。也就是说,当您启动应用程序并打开一些复杂的屏幕时,需要很多 时间。 “很多”是指“很多”。有时可能长达 3-5 秒 - 例如,当有一个包含 100 行的数据网格时。但是,当您转到另一个选项卡,然后返回同一屏幕时,它会快速打开(只要它的视图模型保持不变)。
这很烦人,不仅因为它很慢,而且因为我对此无能为力。如果我能控制慢速,我可能会显示一些“opening, please wait”消息或其他东西......
此外,当我查看其他一些 WPF 应用程序(最著名的是 ILSpy)时,尽管数据量很大,但它们的运行速度似乎相当快。这让我相信我可能做错了什么。但我不知道从哪里开始。
有什么想法吗?有什么经典错误吗?有什么建议吗?
【问题讨论】:
-
您想知道并做出有根据的猜测问题是什么。不要怀疑。不要猜测,也不要指望 Performance Toolkit 会告诉您。 Here's how to find out.
-
@Mike:是的,我广泛使用这种原始采样技术,当性能普遍下降时,它对我有很大帮助。但在这种情况下,我根本没有足够的时间来停止执行,因为性能下降最多只会持续 3-5 秒。此外,在我设法阻止它的极少数情况下,它总是在 WPF 的内部停止。我也确实在追寻这条线索(在 ILSpy 的帮助下),但到目前为止,它看起来非常无望。因此,我的问题更多是关于我在 WPF 上做错了什么。
-
对。它停在 WPF 的内部,但堆栈上有什么?堆栈上的每一行都对所花费的时间负责。我曾经有人说“哦,每次我停止它时,它都在某个迭代器中。这有什么好处?”答案是很好,现在只需查找堆栈,您就会发现问题所在。如果您确实猜到了问题所在,它会告诉您您是否正确,如果您错了,它会告诉您正确的问题是什么。
-
@Mike:栈顶是 WPF,一直到我的
Main()方法。这就是 WPF 的工作原理:它看到它必须显示一些对象(通常是响应鼠标单击,这会激活一个选项卡),所以它进入字典以检索该对象类型的模板,然后实例化该模板.一切都发生了,而无需碰我自己的代码一次。我所做的只是用模板填充这些字典并创建显示的原始对象。但这发生在很久以前,在程序开始时。而且速度很快。 -
@Mike:只是我,还是你突然想知道并做出有根据的猜测?也许首先阅读一些关于 WPF 如何工作的东西不会有什么坏处?这里有一个提示:你有根据的猜测并不完全正确。 ;-)
标签: c# wpf performance templates