李成笔记网

专注域名、站长SEO知识分享与实战技巧

在.Net中如何查看JIT编译器执行流程

起因

在去年看.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相关文档.

  1. ryujit-tutorial.md 介绍JIT执行流程(阶段),里面有上方图
  2. 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

个人能力有限,如果您发现有什么不对,请私信我

如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言