2019-8-31-dotnet-启动-JIT-多核心编译提升启动性能
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
dotnet 启动 JIT 多核心编译提升启动性能
|
lindexi
|
2019-08-31 16:55:58 +0800
|
2019-03-01 15:51:25 +0800
|
dotnet
|
用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执行的时间
Impove App Launch Performance With MultiCore JIT in .NET Framework 4.5
multicore - Does ProfileOptimization actually work? - Stack Overflow
2019-8-31-dotnet-启动-JIT-多核心编译提升启动性能的更多相关文章
- dotnet 启动 JIT 多核心编译提升启动性能
用2分钟提升十分之一的启动性能,通过在桌面程序启动 JIT 多核心编译提升启动性能 在 dotnet 可以通过让 JIT 进行多核心编译提升软件的启动性能,在默认托管的 ASP.NET 程序是开启的, ...
- dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能
我对几个应用进行严格的启动性能评估,对比了在 .NET Framework 和 dotnet 6 下的应用启动性能,非常符合预期的可以看到,在用户的设备上,经过了 NGen 之后的 .NET Fram ...
- agentzh 的 Nginx 教程(版本 2019.07.31)
agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- JIT(动态编译)和AOT(静态编译)编译技术比较
Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...
- S3C6410 纯粹的裸机启动,自己写的SD BOOT启动
这几天晚上一直折腾S3C6410的裸机SD卡启动,不大想使用UBOOT,我是搞硬件的,对底层非常感兴趣,不喜欢已经写好的,因此自己一直在尝试,其实很早之前就试过SD卡启动,也就是ARM11上电后会把S ...
- JIT和AOT编译详解
JIT和AOT编译介绍 JIT - Just-In-Time 实时编译,即时编译 通常所说的JIT的优势是Profile-Based Optimization,也就是边跑边优化 ...
- Linux学习-核心编译的前处理与核心功能选择
硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...
- Angular--AOT和JIT两种编译方式带来的改变
Angular 应用主要由组件及其 HTML 模板组成.由于浏览器无法直接理解 Angular 所提供的组件和模板,因此 Angular 应用程序需要先进行编译才能在浏览器中运行.Angular 提供 ...
随机推荐
- du和df
du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在 的,没有被删除的.(-s:summarize 仅显示总计,只列出最后加总的值) df,disk ...
- sql(10) sum
SUM() 函数SUM 函数返回数值列的总数(总额).SQL SUM() 语法SELECT SUM(column_name) FROM table_name新建表 StudentSS_id Grade ...
- python: 函数递归与尾递归
如果一个函数在内部调用自己,那么这个函数就是递归函数. 例如一个阶乘函数:fact(n)=n! ,其实可以写成 fact(n)=n x fact(n-1). fact(n) 以递归的方式可以表示为: ...
- LUOGU P2564 [SCOI2009]生日礼物 (队列+模拟)
传送门 解题思路 还是比较好想的,用一个队列,然后把所有点放在一起排个序,依次入队.每次检查队头元素的种类是否为当前入队元素种类,是的话就一直\(pop\),每次更新答案即可. 代码 #include ...
- CF 1063B Labyrinth
传送门 解题思路 看上去很简单,\(bfs\)写了一发被\(fst\)...后来才知道好像一群人都被\(fst\)了,这道题好像那些每个点只经过一次的传统\(bfs\)都能被叉,只需要构造出一个一块一 ...
- Spring MVC(十六)--Spring MVC国际化实例
上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...
- ajax跨域请求使用代理
public class ProxyHandler extends HttpServlet { private static final long serialVersionUID = 1L; ...
- 初探JVM总结
什么是JVM Java Virtual Machine(Java虚拟机)的缩写 .本质上是一个程序. java语言运行的平台,是ava跨平台的根本. java默认的三种类加载器 BootStrap C ...
- OpenGL 鼠标交互响应事件
OpenGL 鼠标.键盘交互响应事件 先来一个样例: uses gl,glu,glut; procedure InitEnvironment;cdecl; begin glClearColor();/ ...
- Python全栈开发:模块
模块,用一砣代码实现了某个功能的代码集合. 参考资源:http://www.cnblogs.com/alex3714/articles/5161349.html 类似于函数式编程和面向过程编程,函数式 ...