起因
在去年看.Net Conf China大会中,看到龙芯.Net编译组组长分享的PPT,有一张是介绍JIT执行过程,当时看着挺蒙,其实现在也只是有点印象了.JIT将IL生成机器码过程是比较复杂.不过本文只是简单了解JIT执行流程.
我们先看看分享图:
从上图有3个层次(由上至下,最上方是JIT初始化阶段,中间为优化阶段(初始化阶段和优化阶段还是HIR),下面为后端生成(LIR))
HIR(High-Level Intermediate Representation):高级中间表示
LIR(Low-Level Intermediate Representation):低级中间表示
如何查看JIT编译器执行流程
在源码根目录: docs/design/coreclr/jit ,JIT相关文档.
- ryujit-tutorial.md 介绍JIT执行流程(阶段),里面有上方图
- viewing-jit-dumps.md 有JIT相关配置介绍
文档中,RyuJit执行流程:
如果本地没有编译好的.Net环境,要在本地编译一下: 如何编译.Net 6 Runtime源码
上图中间层,为JIT优化阶段,可以看: 在.Net 6中性能改进系列-JIT
使用PowerShell添加JIT调试环境变量:
// 在控制台输出Main方法 JIT执行流程
// 在.Net 5中可以COMPlus_JitDump="Main",在.Net 6配置环境变量建议由DOTNET_前缀
$env:DOTNET_JitDump="Main"
// 在控制台输出Main方法 JIT生成汇编代码
$env:DOTNET_JitDisasm="Main"
配置环境变量是使用COMPlus_前缀还是DOTNET_目前都是可以的,如果两个都设置了,如:
$env:COMPlus_JitDump="Main"
$env:DOTNET_JitDump="Test" //会以DOTNET_JitDump为准,DOTNET_前缀会覆盖COMPlus前缀
测试代码:
private static void Main(string[] args)
{
int num = 10;
//在.Net 7正式版本, JIT会进行优化
//5个数相加,会转为 num = num << 2; num = num + 10;
int sum = num + num + num + num + num;
Console.WriteLine(sum);
}
先把JIT生成汇编代码环境加入环境变量中,然后执行.\corerun.exe .\NetworkApp.dll(.Net程序,测试代码生成)
.\corerun.exe .\NetworkApp.dll
配置JitDump环境变量后,执行:
.\corerun.exe .\NetworkApp.dll
JitDump输出的内容可以和上图进行对应,因为输出的内容太多,就不展示了,内容已经上传百度网盘了.
//链接: https://pan.baidu.com/s/1Mn_UIfBPMKbAX3h4KKIZkg
//提取码: df5r
个人能力有限,如果您发现有什么不对,请私信我
如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流