)
本文记录9个提升WPF应用程序冷启动性能的策略面列出的3个技术适用于所有WPF应用程序无论使用什么组件Ngen.exeMultiCore JITReadyToRun以下技术是针对DevExpress WPF界面控件的RibbonPage延迟加载对于“Heavy” UI 元素使用LoadingDecorator缓存选项卡按需加载数据预加载主题资源最后一种技术涉及使用Visual Studio的Performance Profiler(帮助确定与性能相关问题的潜在原因)。PS有用控件推荐~DevExpress WPF拥有120个控件和库将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpress新旧版本帮助文档下载可进QQ qun获取1697253161. Ngen.exeNative Image Generator (Ngen.exe) 原生图像生成器是优化 .NET框架应用程序(.NET/. NET Core项目不支持Ngen应该考虑的第一个工具.NET框架项目使用Microsoft中间语言(MSIL)代码生成程序集。在执行应用程序之前需要将此代码转换为机器代码从MSIL到机器代码的转换在启动时就开始了——这个过程可能需要大量的时间。开发人员可以使用Ngen.exe生成已经包含本机代码的原生映像库需要注意的是Ngen.exe应该在将要使用应用程序的机器上使用。开发人员可以在自己的机器上运行它来测试性能但为了优化终端用户的冷启动需要在用户机器上使用Ngen.exe。在用户的机器上运行Ngen的最佳方法是将Ngen.exe合并到应用程序安装程序中。在安装过程中开发人员需要执行以下命令行Ngen.exe将自动处理与项目相关的所有程序集C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe install C:\MyApp.exe如果开发者将应用程序作为单击一次或存档(并且没有安装程序)分发则可以在应用程序启动期间从代码中调用Ngen.exe。要在第一次启动时只运行Ngen.exe为可执行文件计算一个哈希值并在后续启动时检查这个哈希值var savedHash string.Empty; var assemblyLocation Assembly.GetEntryAssembly().Location; // Specify a path to the file that stores your executable’s hash. // Create this file or load the saved hash if the file already exists: var hashPath Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), hash.txt); if (!File.Exists(hashPath)) { File.Create(hashPath); } else { savedHash File.ReadAllText(hashPath); } // Obtain the hash for your executable. // Cancel the operation if the application does not have changes: var hash string.Concat(SHA1.Create().ComputeHash(File.ReadAllBytes(assemblyLocation)) .Select(x x.ToString(x2))); if (hash.Equals(savedHash)) return; // Obtain the path to ngen.exe: var dotNetRuntimePath RuntimeEnvironment.GetRuntimeDirectory(); var ngenPath Path.Combine(dotNetRuntimePath, ngen.exe); // Create a process that runs ngen.exe: var process new Process { StartInfo new ProcessStartInfo { FileName ngenPath, // Pass the path to your executable: Arguments $install \{assemblyLocation}\ /nologo, CreateNoWindow true, WindowStyle ProcessWindowStyle.Hidden, // Run the process as administrator: UseShellExecute true, Verb runas } }; // Run the process and save the executable’s hash: try { process.Start(); process.WaitForExit(); File.WriteAllText(hashPath, hash); } catch { // Failed to start. // For example, a user cancelled the UAC prompt. }Windows 8(以及更新版本的Windows操作系统)包含一个本机映像任务当计算机空闲时它会自动为经常使用的.NET Framework 4.5应用程序生成本机映像。尽管如此开发者仍然需要手动运行Ngen.exe因为本机图像任务仅适用于位于GAC或Windows Store应用程序包中的程序集。下面的图片说明了可以从Ngen.exe启动的好处2. MultiCore JIT或者开发者可以优化Microsoft中间语言(MSIL)到机器代码的转换方法是在应用程序启动时异步转换最常用的方法为此可以使用MultiCore JIT可用于.NET 和 .NET Framework 4.5应用程序。MultiCore JIT记录应用程序使用的方法并将它们保存到磁盘当应用程序第二次执行时保存的方法将在单独的进程中编译为本机代码。开发者只需要在应用构造函数中使用以下两行代码来启用MultiCore JITpublic App() { // Defines where to store JIT profiles ProfileOptimization.SetProfileRoot(C:\MyAppFolder); // Enables Multicore JIT with the specified profile ProfileOptimization.StartProfile(Startup.Profile); }MultiCore JIT在启动优化方面不如Ngen.exe有效但另一方面它同时支持.NET Framework和.NET/. NET Core项目。开发者可以将MultiCore JIT与ReadyToRun选项结合使用(稍后将介绍)并从这两种优化策略中受益。3. ReadyToRunReadyToRun (R2R)是一种提前编译(AOT)的形式用R2R发布的应用程序同时包含MSIL和本机代码段这在一定程度上消除了即时编译的需要。R2R选项仅在.NET/. NET Core项目中可用要启用R2R请修改“. csproj” / “. vbproj”文件和新增PublishReadyToRun标签PropertyGroup PublishReadyToRuntrue/PublishReadyToRun /PropertyGroup要执行此策略请发布您的项目1. 右键单击项目并选择Publish2. 在随后的对话框中选择发布的应用程序将驻留的目标文件夹。3. 打开发布设置选择目标运行时单击Publish按钮4. 打开目标文件夹并运行“.exe”文件。如前所述R2R可以在.NET/. NET Core应用程序中与MultiCore JIT一起使用下图说明了可以从R2R和MultiCore JIT中获得的启动好处。