WPF 热 AppDomain 启动性能(Application.RunInternal、XamlReader.LoadBaml)

2024-03-24

我有相对简单的应用程序,但热(第二次等)启动时间很糟糕,需要 3-5 秒。 Profiler(VS2010,CPU 采样)显示超过 80% 的时间花费在 Application.RunInternal (~40%) 和 XamlRader.LoadBaml (~40%) 函数上。

问题的根源是Window是在非默认的AppDomain中创建的。如果我将窗口创建移至默认 AppDomain 或给予 AppDomain 无限制的权限设置,一切都会如预期的那样快。


我正在测试:

  • Windows 7 x64
  • .Net 4.0
  • 4Gb RAM
  • GeForce 9800GT 1Gb。

我用这种方式创建AppDomain

var permissionSet = new PermissionSet(null);

permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution | SecurityPermissionFlag.SerializationFormatter | SecurityPermissionFlag.UnmanagedCode));
permissionSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new UIPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new MediaPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new FileDialogPermission(PermissionState.Unrestricted));

var appDomainSetup =
    new AppDomainSetup
    {
        ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
        ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
        DisallowApplicationBaseProbing = false,
        DisallowBindingRedirects = true,
        DisallowCodeDownload = true,
        DisallowPublisherPolicy = true,
        LoaderOptimization = LoaderOptimization.MultiDomainHost
    };

_appDomain =
    AppDomain.CreateDomain(
        name,
        null,
        appDomainSetup,
        permissionSet,
        new[]
    {
        // a few types I need
        typeof(...).Assembly.Evidence.GetHostEvidence<StrongName>(),
    });

即使我将 XAML 剥离为空窗口,行为也保持不变

<Window
    x:Class="Rosmurta.Extensibility.WpfUI.RosmurtaWindow"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test"
    Height="480"
    Width="640"
    WindowStyle="SingleBorderWindow">
    <Grid>
    </Grid>
</Window>

XamlRader.LoadBaml 解析的内容并不算多,但它花费了超过 30% 的启动时间事件来处理空窗口。


我已经尝试过(但没有帮助)

  • 添加到 App.config。
  • 将 [LoaderOptimization(LoaderOptimization.Multi Domain Host)] 属性添加到 Main 方法。
  • 向所有程序集添加签名。

还可以做什么?


这个问题很老了,但我的回答可能会对某人有所帮助。有时,XAMLReader 在启动过程中肯定会花费很多时间,但这并不总是意味着问题是由解析本身引起的。在解析XAML时,XAMLParser除了解析之外还会执行几个相对较重的操作:

  • 使用反射获取未知类型和 crate 实例
  • 初始化对象并创建实例。如果您的 XAML(或您正在使用的组件库的 XAML)包含许多自定义类,它们是由 XAMLParser 创建的,并且会发生抖动。
  • 在资源字典层次结构等中搜索资源。如果资源字典的层次结构确实很复杂,那么这个操作会花费一些时间。

有几种通用技术可以帮助您减少 WPF 应用程序的启动时间:

  • 使用 Ngen 工具生成本机映像。
  • 当 Ngen 不适用时启用多核 JIT
  • 将 ReadyToRun 与 MultiCore JIT 结合使用用于 .NET Core 项目,因为它们没有 Ngen
  • 按需加载数据。我认为这不是你的情况,但可能对全面了解有用。例如,DevExpress 有虚拟源和服务器模式 https://docs.devexpress.com/WPF/116265/controls-and-libraries/data-editors/common-features/binding-to-data/server-mode为您异步执行此操作的功能。
  • 您还可以将“重”视图包装在控件中,延迟其加载,而不会冻结 UI。例如,您可以使用DevExpress加载装饰器
  • 确保您的视图控件没有扩展到可见区域之外。例如,如果您有一个带有 ListBox 的 StackPanel,ListBox 将立即创建其所有元素,因为 StackPanel 不限制其子元素的高度,并且它们“认为”它们具有无限的高度。因此,ListBox 将立即创建所有视觉元素并显着降低您的性能。
  • 作为确定瓶颈的简单方法,您可以评论 UI,您可以评论我们的 XAML 部分,看看这如何影响启动

这是一篇可能有帮助的博客文章:减少 WPF 应用程序启动时间的 9 个技巧 https://community.devexpress.com/blogs/wpf/archive/2023/01/26/9-tips-to-reduce-wpf-app-startup-time.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 热 AppDomain 启动性能(Application.RunInternal、XamlReader.LoadBaml) 的相关文章

  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • 如何获取我的应用程序已创建的应用程序域的列表?

    我有一个服务应用程序 它在长时间运行的任务的使用过程中创建AppDomain 我一直通过将它们存储在具有唯一 ID 的哈希表中来跟踪它们 任务完成后 服务应用程序会卸载分配给该任务的 AppDomain 然后将其从 appdomain 哈希
  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • 如何在MVVM中实现对话框架构

    我正在开发一个基于 PRISM 框架 Unity Container 的 WPF 4 0 MVVM 应用程序 我想知道在 mvvm 模式中实现对话框的最佳方法是什么 我计划在我的应用程序中使用相当多的东西 所以我想要一些可重用的东西 由于您
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • 如何动态加载包含非托管代码的原始程序集?(绕过“无法验证的代码失败策略检查”异常)

    我将举一个使用的例子系统 Data SQLite DLL http sqlite phxsoftware com 这是一个包含非托管代码的混合程序集 如果我执行这个 var assembly Assembly LoadFrom System
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 网格内的 ContentPresenter 可见性绑定不起作用?

    我有以下网格
  • ItemSource 中具有不同类型数据的 ListView 多行列标题

    继续this https stackoverflow com q 26712051 1997232问题 我想实现这种ListView 它应该有两件事 多行列标题 不同的数据类型通过绑定ItemsSource以不同方式显示 为了解决 1 我尝
  • 窗口关闭后仍在调用方法

    首先我不知道这是不是一个愚蠢的问题 我有这样的场景 首先我有一个主窗口 public MainWindow InitializeComponent dt is a System Windows Threading DispatcherTim
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • ListView ItemContainerStyle 模板

    我创建了用作 ListView 项目模板的样式 其中包含 CheckBox 和 TextBlock
  • 如何从代码隐藏访问ListBox动态创建的项目的属性?

    XAML
  • 先学Silverlight还是先学WPF?

    看来 Silverlight WPF 是 NET 用户界面开发的长期未来 这很棒 因为我可以看到在客户端和 Web 开发端重用 XAML 技能的优势 但看看 WPF XAML Silverlight 它们似乎是非常庞大的技术 那么从哪里开始
  • 混合 MFC 和 WPF:模态对话框

    我使用 C CLI 界面层将 C WPF 对话框添加到现有的 C MFC 应用程序 我一切正常 只是我遇到了形式问题 例如 MFC 应用程序使用 ShowDialog 显示 WPF 对话框 按预期工作 该 WPF 对话框显示使用 DoMod
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups

随机推荐