title author date CreateTime categories
WPF 通过 ReadyToRun 提升性能
lindexi
2019-07-02 10:29:55 +0800
2019-06-26 09:27:38 +0800
WPF

通过 ReadyToRun 可以在程序集同时包含 IL 和本机代码,可以有效提升软件的启动速度

在 .NET Core 3.0 Preview 6 发布了 ReadyToRun 的功能,通过这个功能可以提升软件的启动性能,在程序设置在发布的时候使用 ReadyToRun 的特性,将会编译出来 ReadyToRun(R2R)格式的程序集

在这个程序集里面同时包含了 IL 和本机代码,可以做到在启动的时间减少 JIT 编译的时间,减少的这部分启动时间是 JIT 编译代码使用的时间

经过测试,在测试项目上,可以从原来的 1.9 秒的启动时间使用 ReadyToRun 减少为 1.3 秒的时间,同时因为在启动过程不需要 JIT 进行中间编译,可以节省此部分的内存,将内存从 69.1 MB 降低为 55.7 MB 大小

当然在运行性能上的提升同时也会让应用程序大小变大因为当前的应用程序会同时包含 IL 和本机代码,在相同的测试项目上,应用程序的大小从原来的 150MB 变为 156MB 这个大小对于桌面端应用程序几乎是可以被忽略

我认为使用 ReadyToRun 是对桌面端应用程序的极大的提升,这个功能其实已经很古老了,但是一直都没有发布,下面让我告诉大家如何在项目上应用这个白科技提高软件性能

请确定本地的 dotnet sdk 版本大于 .NET Core 3.0 Preview 6 使用以下命令可以知道自己的 sdk 版本

dotnet --info

在控制台输入上面代码将会输出当前设备安装的版本

 Version:   3.0.100-preview6-012264
Commit: be3f0c1a03 运行时环境:
OS Name: Windows
OS Version: 10.0.18362
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\3.0.100-preview6-012264\

如果发现自己的版本比较低请到官网 下载最新版本安装

打开或新建一个 WPF 项目,在项目文件里面添加属性 PublishReadyToRun 请看代码

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

    <PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup> </Project>

注意,并非只有 WPF 可以使用这个特性,理论上任何的 dotnet core 程序都可以

在添加了 <PublishReadyToRun>true</PublishReadyToRun> 之后可以进行发布,此时发布的时候需要带上确定的运行环境属性,因为这个特性是编译为本地代码需要对每个平台编译为特定的代码

同时 ReadyToRun 只能用于独立部署 的应用

请使用下面代码进行发布使用 ReadyToRun 特性的程序

dotnet publish -c release  -r win-x64 --self-contained

因为 ReadyToRun 是对特性的平台创建特定的代码,所以 -r 属性是不能少的。另外因为默认只对独立部署生效,所以独立部署属性可选添加

一个空白的 WPF 程序编译的时候将会让程序文件多了大约 3k 的大小,但是这部分关系不大,因为在 .NET Core 3.0 Preview 6 还发布了 Assembly linking 功能用于减少应用程序大小

此时的应用程序包含了本机代码,如果需要同时创建本机代码的符号,请在项目文件添加以下代码

        <PublishReadyToRunEmitSymbols>true</PublishReadyToRunEmitSymbols>

现在的项目文件代码如下

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

    <PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishReadyToRunEmitSymbols>true</PublishReadyToRunEmitSymbols>
</PropertyGroup> </Project>

依然使用上面的命令发布

dotnet publish -c release  -r win-x64 --self-contained

此时在发布的文件夹可以找到比原来多出的 .ni.pdb 文件,这就是本机代码的符号文件

关于项目文件的配置请看我的项目 下载之后可以使用本文方法进行编译

更多请看官方文档

Announcing .NET Core 3.0 Preview 6

coreclr/readytorun-overview.md at master · dotnet/coreclr

coreclr/crossgen.md at master · dotnet/coreclr

2019-7-2-WPF-通过-ReadyToRun-提升性能的更多相关文章

  1. dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能

    我对几个应用进行严格的启动性能评估,对比了在 .NET Framework 和 dotnet 6 下的应用启动性能,非常符合预期的可以看到,在用户的设备上,经过了 NGen 之后的 .NET Fram ...

  2. [NewLife.XCode]扩展属性(替代多表关联Join提升性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  3. [NewLife.XCode]高级查询(化繁为简、分页提升性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  4. SQL Server中使用Check约束提升性能

        在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能.     在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划, ...

  5. paip.提升性能--多核cpu中的java/.net/php/c++编程

    paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http ...

  6. paip. 提升性能---hibernate的缓存使用 总结

    paip. 提升性能---hibernate的缓存使用 总结 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  7. Android ViewPager Fragment使用懒加载提升性能

     Android ViewPager Fragment使用懒加载提升性能 Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Androi ...

  8. paip.提升性能---mysql 优化cpu多核以及lan性能的关系.

    paip.提升性能---mysql 优化cpu多核以及lan性能的关系. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...

  9. paip.提升性能---mysql 性能 测试以及 参数调整.txt

    paip.提升性能---mysql 性能 测试以及 参数调整.txt 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://b ...

  10. paip.提升性能---jvm java 工具使用.

    paip.提升性能---jvm java 工具使用. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...

随机推荐

  1. RSA进阶(一)

    本篇为RSA进阶篇,继RSA入门 [RSA3]P1(扩展欧几里得) 题目 from Crypto.Util.number import * flag = b'******' m1 = bytes_to ...

  2. MVC架构设计浅析(WEB网页开发)

    MVC架构设计浅析 杨传伟 (石家庄铁道大学信息科学与技术学院,河北省,石家庄市,050043) 摘 要:本文以图书管理系统为案例(当前主流框架SpringMVC的原理来分析MVC的设计理念等),深入 ...

  3. HTTPS&SPDY&HTTP2&QUIC&HTTP3

    HTTPS 密钥交换,加密和解密 SPDY&HTTP2 QUIC&HTTP3

  4. #贪心#洛谷 6927 [ICPC2016 WF]Swap Space

    题目 分析 可以发现能将硬盘容量变大的优先,这种硬盘就是以格式化前的大小升序排序. 然后如果硬盘容量变小,那就是先填格式化后较大的硬盘(因为装完可以提供较大的空间) 代码 #include <c ...

  5. Manacher小记

    目录 前言 洛谷 3805[模板]manacher算法 题目 分析 代码 洛谷 4555 最长双回文串 题目 分析 代码 洛谷 1659 拉拉队排练 题目 分析 代码 前言 皆移植于原csdn博客,略 ...

  6. Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新

    目录 简介 Spring Boot的基本操作 Spring Boot的构建和部署 Spring Boot工具 Spring Boot的测试 Spring Boot中使用JPA Spring Boot和 ...

  7. Go 语言输出文本函数详解

    Go语言拥有三个用于输出文本的函数: Print() Println() Printf() Print() 函数以其默认格式打印其参数. 示例 打印 i 和 j 的值: package main im ...

  8. Java轻松实现,每天给对象发情话!

    一.引言 最近看到一篇用js代码实现表白的文章,深有感触.然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞实现思路: 使用HttpClient远程获取彩虹屁生成 ...

  9. 给你安利一款鲁班大叔开发的maven依赖搜索神器

    写在前面 一款好的插件往往能提高我们的开发效率.今天就给大家安利一款maven 依赖搜索插件. 插件是自己一直关注的鲁班大叔开发的,用了几天真的好用 废话不多说,我们就来看看这是一款什么插件 一.ma ...

  10. HarmonyOS应用侧与前端页面数据通道建立

    一.  应用侧调用前端页面函数 应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数.在下面的示例中,点击应用侧的"runJavaScript" ...