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执行的时间

ProfileOptimization

Impove App Launch Performance With MultiCore JIT in .NET Framework 4.5

multicore - Does ProfileOptimization actually work? - Stack Overflow

2019-8-31-dotnet-启动-JIT-多核心编译提升启动性能的更多相关文章

  1. dotnet 启动 JIT 多核心编译提升启动性能

    用2分钟提升十分之一的启动性能,通过在桌面程序启动 JIT 多核心编译提升启动性能 在 dotnet 可以通过让 JIT 进行多核心编译提升软件的启动性能,在默认托管的 ASP.NET 程序是开启的, ...

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

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

  3. agentzh 的 Nginx 教程(版本 2019.07.31)

    agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...

  4. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  5. JIT(动态编译)和AOT(静态编译)编译技术比较

    Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...

  6. S3C6410 纯粹的裸机启动,自己写的SD BOOT启动

    这几天晚上一直折腾S3C6410的裸机SD卡启动,不大想使用UBOOT,我是搞硬件的,对底层非常感兴趣,不喜欢已经写好的,因此自己一直在尝试,其实很早之前就试过SD卡启动,也就是ARM11上电后会把S ...

  7. JIT和AOT编译详解

    JIT和AOT编译介绍 JIT - Just-In-Time             实时编译,即时编译 通常所说的JIT的优势是Profile-Based Optimization,也就是边跑边优化 ...

  8. Linux学习-核心编译的前处理与核心功能选择

    硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...

  9. Angular--AOT和JIT两种编译方式带来的改变

    Angular 应用主要由组件及其 HTML 模板组成.由于浏览器无法直接理解 Angular 所提供的组件和模板,因此 Angular 应用程序需要先进行编译才能在浏览器中运行.Angular 提供 ...

随机推荐

  1. postgresql使用pg_dump和pg_restore 实现跨服务器的数据库迁移或备份

    因为业务需求,需要将服务器上的postgre多个数据库的数据整个库得迁移到另一个postgre数据库上. 一般表较少时,会使用postgre 的copy to 和 copy from 命令就能完成表的 ...

  2. IPsec分析/测试/

    一   局域网拓扑图 局域网环境搭建步骤: (升级最新版本 ,恢复出厂设置后) 1 两台网关wan口直连,分别接两台pc , 2 局域网网络测试,正常情况下PC1 和PC2 互通 ,测试通过在进行ip ...

  3. What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR

    What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR? it is impossible to say. Dif ...

  4. Delphi利用Windows GDI实现文字倾斜

    Delphi利用Windows GDI实现文字倾斜 摘要 Delphi利用Windows GDI实现文字倾斜 procedure TForm1.FormPaint(Sender: TObject);v ...

  5. Markdown转义字符表

  6. Http学习(三)

    HTTP的问题: 通信使用明文,可能会遭到窃听:HTTP本身不具备加密功能,根据TCP/IP协议工作的线路上可能会遭到窃听,即使通信内容已经加密,也会被看到 通信加密:通过SSL(Secure Soc ...

  7. VS2010-MFC(常用控件:列表视图控件List Control 下)

    转自:http://www.jizhuomi.com/software/197.html 上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构 ...

  8. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  9. STL容器set用法以及codeforces 685B

    以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写. 首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文 ...

  10. js文件操作之——导出Excel (js-xlsx)

    前阵子跟server同学讨论一个Excel导出的需求,我说JS搞不定,需要server来做,被server同学强行打脸. 今天研究了下,尼玛,不光可以,还很强大了! 总结:经验是害人的,尤其是在发展迅 ...