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-012264Commit:    be3f0c1a03运行时环境:OS Name:     WindowsOS Version:  10.0.18362OS Platform: WindowsRID:         win10-x64Base 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. Git 2.18版本发布:支持Git协议v2,提升性能

    2019独角兽企业重金招聘Python工程师标准>>> Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要 ...

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

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

  4. 04 | 穿越功耗墙,我们该从哪些方面提升“性能”?

    04 | 穿越功耗墙,我们该从哪些方面提升"性能"? 一直以来都知道自己有关计算机底层的知识不是不扎实,前段时间跟着大佬们推荐在[极客时间]买了 徐文浩 老师的专栏 深入浅出计算机 ...

  5. 深入浅出计算机组成原理(四)——穿越功耗墙,我们该从哪些方面提升“性能”?

    文章目录 功耗:CPU 的"人体极限" 并行优化,理解阿姆达尔定律 总结延伸 补充阅读 课后思考 上一讲,在讲 CPU 的性能时,我们提到了这样一个公式: 程序的 CPU 执行时间 ...

  6. 深入浅出计算机组成原理04-穿越功耗墙,我们该从哪些方面提升“性能”?

    上一讲,在讲 CPU 的性能时,我们提到了这样一个公式: 程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time 这么来看,如果要提升计算机的性能,我们可以从指令数.CPI 以 ...

  7. 深入计算机组成原理(四)穿越功耗墙,我们该从哪些方面提升“性能”?

    上一讲,在讲CPU的性能时,我们提到了这样一个公式: 程序的CPU执行时间 = 指令数 x CPI x Clock Cycle Time 这样来看,如果要提升计算机的性能,我们可以从指令数.CPI以及 ...

  8. 计算机组成原理 | 穿越功耗墙,我们该从哪些方面提升“性能”?

    上一讲,在讲 CPU 的性能时,我们提到了这样一个公式: 程序的 CPU 执行时间 = 指令数×CPI×Clock Cycle Time 这么来看,如果要提升计算机的性能,我们可以从指令数.CPI 以 ...

  9. 教师计算机应用能力提升培训总结,2019年教师信息技术应用能力提升培训总结.docx...

    2019年教师信息技术应用能力提升培训总结 第 PAGE \* Arabic \* MERGEFORMAT 1 页 2019年教师信息技术应用能力提升培训总结 篇一:2019中小学教师信息技术应用能力 ...

  10. 【04】穿越功耗墙,我们该从哪些方面提升“性能”?

    [计算机组成原理]学习笔记--总目录 [04]穿越功耗墙,我们该从哪些方面提升"性能"? 前言 一.功耗:CPU 的"人体极限" 二.并行优化,理解阿姆达尔定律 ...

最新文章

  1. 自定义Android注解Part3:绑定
  2. linux 安装tinyxml,使用TinyXml
  3. 远程连接linux服务器mysql
  4. python 函数递归一次增加一次变量_python基础之函数、返回值,局部变量、全局变量,递归(继续补充不定长参数)...
  5. superset数据集birth_names的负时间戳处理
  6. 信安教程第二版-第18章网络安全测评技术与标准
  7. 模拟ios_王者荣耀策划Donny:安卓IOS今年或实现互通!模拟战一周一更新
  8. 硬件基础知识---(12) PCB的生产流程
  9. Windows终端中的自定义终端和用户界面(UI)
  10. 下面的3条指令执行后,CPU几次修改IP?
  11. 万能Ghost全攻略(最详细完整的教程)
  12. IPCamera可以通过BackChannel进行对讲?
  13. 浅谈http协议六种请求方法,get、head、put、delete、post、options区别
  14. 微软去年安全业务收入150亿美元、新勒索软件以威联通设备为目标|1月27日全球网络安全热点
  15. 宅霸java_宅霸游戏联机平台下载|宅霸游戏联机平台免费版下载 v4.5.0 官方版_小皮网...
  16. CCF推荐-计算机网络领域顶级期刊会议,CCF推荐学术期刊及其会议计算机网络.pdf...
  17. 《水经注全国POI兴趣点1.0》发布
  18. Mac/Macbook Apple ID 无法登录:验证失败,发生未知错误
  19. python环境下,PIP卸载、重装、升级
  20. 风暴过后的小红书破圈解题,社区价值或被重估

热门文章

  1. 【CODEVS】2833 奇怪的梦境
  2. 重写重载—重写详细解释
  3. 修改个人资料和头像的协议数据包
  4. 中国科学院大学计算机学院夏令营,中国科学院大学2018年全国大学生“软件与网络”夏令营通知...
  5. 安卓 jni 开发错误 undefined reference to __android_log_print
  6. 基于SSM 和 layui 的增删查改
  7. jtag和swd区别,该用哪个?
  8. 用httpUrlConnection实现文件上传
  9. 【虹科案例】极高的精度水平——虹科数字化仪在大型强子对撞机机器保护系统中的应用
  10. python set集合的基本运算