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. 使用maven命令 创建基于Scala的flink项目

    windows下 mvn archetype:generate ^ -DarchetypeGroupId=org.apache.flink ^ -DarchetypeArtifactId=flink- ...

  2. 一行代码 python 证件照换底色

    安装所需模块 pip install OpenCV-python pip install cvzone pip install mediapipe 代码 import cv2 import cvzon ...

  3. KingbaseES V8R3 备份恢复系列之 -- sys_rman备份过程分析

    ​ 案例说明: 本案例通过对KingbaseES sys_rman物理备份过程的详细描述,有助于在执行sys_rman过程中发生故障的分析. 适用版本: KingbaseES V8R3 一.sys_r ...

  4. 06 PSP成熟度模型【软件过程与管理】

    PSP成熟度模型(Personal Software Process) 个体度量过程 PSP3 周期开发 个体计划过程 PSP2 代码评审 设计评审 PSP2.1 设计模板 个体质量管理过程 PSP1 ...

  5. C++ 互斥

    mutex mutex 类是能用于保护共享数据免受从多个线程同时访问的同步原语. mutex 提供排他性非递归所有权语义: 调用方线程从它成功调用 lock 或 try_lock 开始,到它调用 un ...

  6. 基于UDP的服务器端/客户端

    基于UDP的数据I/O函数 //成功时返回传入的字节数,失败时返回-1 ssize_t sendto (int __fd, const void *__buf, size_t __n, int __f ...

  7. Vue入门笔记三(Vuex)

    <Vue.js项目实战> Vuex 集中式的状态管理 Vuex从Flux(由Facebook开发)的概念中获取得灵感.Flux又一系列指导原则构成,阐明了如何使用集中式store来实现组件 ...

  8. 基于HANA重构业务的总结

    本文于2019年7月29日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 依据领导的规划,本月启动了一项业务迁移工作,作为特别行动,部门安 ...

  9. 初学STM32 SDIO(一)

    1. SDIO协议简介 ​ SDIO全称是安全数字输入/输出接口 ,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另外一种就是SDIO接口. 多媒体卡(MMC).SD卡. S ...

  10. BI小白收藏|一文告诉你什么是商务智能

    近年来,商务智能(BI)已成为继企业资源计划之后企业信息化建设的热点领域,在国内发展迅速.利用商务智能可以为企业整合集成现有的业务数据,在深度挖掘分析的基础上为管理决策者提供决策辅助,提高科学决策水平 ...