【问题标题】:Performance issue when launching WPF application启动 WPF 应用程序时的性能问题
【发布时间】:2014-11-19 15:55:23
【问题描述】:

我有一个复杂的 WPF 应用程序,它使用了共享资源字典中的大量资源。 初始化的第一个窗口需要 8 秒来初始化。 SSD 磁盘驱动器的性能问题较少,但仍需要 2 秒。

我尝试使用 Visual Studio Profiler,但它显示 InitializeComponent(); 的时间成本很高; 需要显示的窗口。

我相信它与使用的 Resource 字典有关,但我无法替换它,因为我真的需要它,而且所有窗口和 WPF 元素都在使用 StaticResource 引用。

我尝试尽可能优化发布。 我创建了许多后台线程,但这并没有太大帮助。每当需要显示一个窗口时,它必须附加在同一 Dispatcher 下的 UI 线程上。这会造成很大的性能问题,并且屏幕上的所有 UI 和任何进度条都会被阻止。

所以总结一下。从调用 ShowDialog 到显示窗口为止 需要 8 秒。这仅在第一个窗口上可见。之后打开的任何其他窗口都会快速显示。

现在我首先要问的是后台发生了什么以及为什么这个延迟如此之大,其次可以做些什么来提高启动速度。

我没有提到,但在启动过程中没有出现异常或数据错误,所以它是 与异常无关。

我认为这与按钮和其他组件的初始化有关,因为几乎所有这些组件都重新设置了 ControlTemplate 的样式。

【问题讨论】:

    标签: c# wpf multithreading performance


    【解决方案1】:

    需要加载大量程序集并且必须对大量代码进行 JIT 编译,然后才能显示您的第一个窗口。一种减少启动时间的有用技术是以一种在需要类型之前不加载类型的方式来构建代码。在深入研究核心 WPF 程序集之外的代码之前,最好在屏幕上显示一个带有等待指示器的空白窗口。针对该场景进行优化。

    如果您想尽快在屏幕上显示某些内容,请避免过早加载图像/媒体和其他资源。

    避免同步加载任何数据,并尽可能少地在视图和视图模型构造函数中执行操作。延迟加载数据,直到您的视图显示(如有必要,抛出等待指示器)。

    如果您认为您的 Xaml 资源有问题,请将它们拆分,并让每个视图仅提取它需要的资源。不要将它们合并到App.xaml。您还可以研究如何在多个视图中 share the resources more efficiently

    Throwing up a splash screen 可以改善感知的启动时间。在屏幕上显示任何内容,让用户知道您的应用实际上正在做某事。

    最后,不要太担心;启动时间差是 WPF 应用程序的标志,最终,您能做的只有这么多。

    【讨论】:

    • 不幸的是,这对我没有帮助。我不允许使用启动画面。在第一个屏幕上加载时没有使用繁重的代码或数据。只有 2 个按钮和一个 LinearGradientBrush 背景。甚至分析器也不知道如何测量 InitializeComponent(); 背后发生的事情;它必须与 XAML 和资源相关。需要查找有关如何初始化资源字典的更多信息。
    • "它必须与 XAML 和资源有关。" => 你认为为什么会这样?
    • 因为我测量了初始化所花费的时间。与其他代码的加载相比,这是一个很大的不同。大约 87% 的时间用于资源,4.7 用于后面的代码 + 剩下的几个百分比用于某些 dll...
    • 您能否通过删除您认为有责任的资源来证实测量结果?
    • 第一次加载的代码只加载几个按钮一个画笔和两张图片,但字典包含转换器、所有可能和使用的画笔、重新设置样式的按钮等。我重新设计了所有内容以仅加载少量必需的东西,但速度保持不变。不幸的是,Profiler 无法向我提供有关哪些资源花费更多时间的详细信息。如果我开始删除资源,应用程序会崩溃,因为有很多 StaticResource 关系。返工真的很痛苦,因为我已经尽量减少了所有可能的事情。这总是一种权衡。加载慢或运行快
    【解决方案2】:

    您还可以使用ProfileOptimization 类来缩短程序后续会话的启动时间。开发人员可能对您没有帮助,但可能会对您的用户产生更好的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多