当前位置:网站首页>dotnet 启动 JIT 多核心编译提升启动性能
dotnet 启动 JIT 多核心编译提升启动性能
2022-08-04 20:51:00 【林德熙】
用2分钟提升十分之一的启动性能,通过在桌面程序启动 JIT 多核心编译提升启动性能 在 dotnet 可以通过让 JIT 进行多核心编译提升软件的启动性能,在默认托管的 ASP.NET 程序是开启的,对 WPF 等桌面程序需要手动开启
在 Main 函数或 App 的构造函数添加下面代码可以开启
using System.Runtime;
ProfileOptimization.SetProfileRoot(@"C:\lindexi\");
ProfileOptimization.StartProfile("Startup.Profile");在 SetProfileRoot 设置一个文件夹,这个文件夹需要是已经存在文件夹,如果设置到一个不存在的文件夹,那么这个方法也不会出现异常,只是什么都不会做
在StartProfile设置一个文件名,将会在这个文件记录启动的时候需要调用的函数
原理
在可以进行多线程计算的设备,可以通过一个线程运行代码,多个线程进行 JIT 编译,提高性能。
在 SetProfileRoot 设置一个文件夹,将会在这个文件夹存放用于提升性能的文件,在 StartProfile 将会创建一个二进制文件记录在启动的时候需要调用的函数
在第一次运行程序的时候,会判断是否存在提升性能的文件,如果不存在就在启动的时候后台收集需要调用的函数,将这些函数记在提升性能的文件。
在第二次运行程序的时候,因为已经存在提升性能的文件,读取这个文件可以知道在启动的时候需要调用的函数,于是就进行后台多线程JIT编译这些会调用到的方法
启动这个功能
默认在 ASP.NET 是启动这个功能,如果需要关闭这个功能,请在 web.config 文件添加下面代码
<system.web>
<compilation profileGuidedOptimizations="None" />
</system.web>在 WPF 等桌面程序默认是没有开启,需要调用本文一开始说的两个函数开启,需要注意两个方法的顺序是固定,先设置文件夹然后设置文件,注意设置的文件夹需要是存在同时可以写文件
请在程序执行调用 SetProfileRoot 两个函数,如 Main 或 App 构造函数
如果一个应用程序表现是根据传入的命令行有不同的运行方法,如我在做的软件,有备课和授课两个不同的方法,这两个不同的方法启动需要调用的方法也不相同,就需要通过命令行在 StartProfile 使用两个不同的文件,对于不同的模式使用不同文件
ProfileOptimization.SetProfileRoot(@"C:\lindexi\");
if ( Editing )
{
// 现在进入备课模式
ProfileOptimization.StartProfile("Editing.Profile");
}
else
{
// 现在使用的是授课方法
ProfileOptimization.StartProfile("Displaying.Profile");
}这里可以根据不同的命令参数使用不同的文件,这样不同的命令可以对使用的不同的启动方法做不同优化
环境
要求是在非单核的设备上,同时需要在 .NET Framework 4.5 和以上或 dotnet core 3.0 以上
性能
经过很多次测试,发现调用 SetProfileRoot 两个函数需要的时间在我的设备上大概是 0.2 ms 这个时间不算短,同时发现实际到软件启动完成的时间几乎没有提升
因为很多软件的启动时间都在文件读写上,而不是在 JIT 编译的时间
所以不启动这个功能和启动的启动性能几乎没有提升
为什么这个功能不在默认的桌面程序打开?因为这个功能需要读写提升性能的文件,而默认很难知道这个文件应该放在哪,同时启动的时候读取文件的时间很多时候比JIT编译长。
在 ASP.NET 可以通过托管的方式做到自动读取提升性能的文件,所以默认就在 ASP.NET 使用
在 dotnet core 还可以使用阶梯编译 在软件启动的过程使用到的方法都使用快速编译的方法,减少JIT执行的时间
边栏推荐
- Five Minutes Introductory Text Processing Three Musketeers grep awk sed
- win10 uwp modify picture quality compress picture
- 香港暂停进口俄罗斯部分地区禽肉及禽类产品
- 推荐系统_刘老师
- After the tester with 10 years of service "naked resignation" from the big factory...
- Comic | Two weeks after the boss laid me off, he hired me back and doubled my salary!
- 【手把手教你使用STM32HAL库的串口空闲中断】
- 腾讯云胡启明:Kubernetes云上资源的分析与优化
- 面试官:索引为什么会失效?
- 机器学习_02
猜你喜欢

【2022牛客多校5 A题 Don‘t Starve】DP

刷题-洛谷-P1319 压缩技术
![[TypeScript] In-depth study of TypeScript enumeration](/img/27/4836e59528bb5a51ffc1cf9961c6b6.png)
[TypeScript] In-depth study of TypeScript enumeration

ts集成和使用

MATLAB中readtimetable函数用法

Web3时代的战争

Oreo domain name authorization verification system v1.0.6 public open source version website source code

win10终端中如何切换磁盘

实现菜单拖拽排序

阿里的arthas使用,入门报错:Unable to attach to 32-bit process running under WOW64
随机推荐
数字IC设计中基本运算的粗略的延时估计
【2022杭电多校5 1012题 Buy Figurines】STL的运用
jMeter Thread group 对应的 constant timer
【AGC】构建服务1-云函数示例
web漏洞扫描器-awvs
2、字符集-编码-解码
About the state transfer problem of SAP e-commerce cloud Spartacus UI SSR
工龄10年的测试员从大厂“裸辞”后...
win10 uwp 使用 ScaleTransform 放大某个元素
Unreal 本地化 国家化 多语言
零知识证明——zkSNARK证明体系
基于单向链表结构的软件虚拟定时器的设计与构建
格密码入门
[Academic related] Tsinghua professor persuaded to quit his Ph.D.:I have seen too many doctoral students have mental breakdowns, mental imbalances, physical collapses, and nothing!...
大资本已开始逃离加密领域?
【1403. 非递增顺序的最小子序列】
取证程序分类
机器学习_02
如何找到某个 ABAP structure 某字段的源头来自哪个数据库表
零知识证明笔记——私密交易,pederson,区间证明,所有权证明