最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
深入理解.NET 的JIT编译方式
时间:2022-07-02 10:55:26 编辑:袖梨 来源:一聚教程网
CLR只执行本机的机器代码。有两种方式产生本机的机器代码:实时编译(JIT)和预编译方式(产生native image)。下面,我想谈谈JIT。
CLR使用类型的方法表来路由所有的方法调用。类型的方法表由多个入口项组成。每个入口项指向一个唯一的存根例程(stub routine)。初始化时,每个存根例程包含一个对于CLR的JIT编译器的调用(它由内部的PreStubWorker程序公开)。在JIT编译器生成本机代码后,它会重写存根例程,插入一个jmp指令跳转到刚才JIT编译器的代码。只有当要调用某个方法时,JIT编译器才会将CIL的方法体编译为相应的本机机器码版本。这样可以优化程序的工作集。
对于如下的例子:
//using System;
public class Bob{
static int x;
static void a(){x+=2;}
static void b(){x+=3;}
static void c(){x+=4;}
public static void f()
{
c();
b();
a();
}
}
public class MyClass
{
public static void Main()
{
Bob.f();
}
}
用调试器进行JIT调试。
首先,看一下每个方法的汇编显示:
Main()的汇编显示为:
push ebp
mov ebp,esp
//调用Bob.f()方法
call dword ptr ds:[00975394h]
nop
pop ebp
ret
[注]00975394h是Bob.f()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址,该地址中的内容是对应的存根例程的开始地址。
f()的汇编显示为:
push ebp
mov ebp,esp
//调用Bob.c()方法
call dword ptr ds:[00975390h]
//调用Bob.b()方法
call dword ptr ds:[0097538Ch]
//调用Bob.a()方法
call dword ptr ds:[00975388h]
nop
pop ebp
ret
[注]00975390、0097538c、00975388分别为Bob.c()、Bob.b()、Bob.a()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址,该地址中的内容是对应的存根例程的开始地址。
CLR使用类型的方法表来路由所有的方法调用。类型的方法表由多个入口项组成。每个入口项指向一个唯一的存根例程(stub routine)。初始化时,每个存根例程包含一个对于CLR的JIT编译器的调用(它由内部的PreStubWorker程序公开)。在JIT编译器生成本机代码后,它会重写存根例程,插入一个jmp指令跳转到刚才JIT编译器的代码。只有当要调用某个方法时,JIT编译器才会将CIL的方法体编译为相应的本机机器码版本。这样可以优化程序的工作集。
对于如下的例子:
//using System;
public class Bob{
static int x;
static void a(){x+=2;}
static void b(){x+=3;}
static void c(){x+=4;}
public static void f()
{
c();
b();
a();
}
}
public class MyClass
{
public static void Main()
{
Bob.f();
}
}
用调试器进行JIT调试。
首先,看一下每个方法的汇编显示:
Main()的汇编显示为:
push ebp
mov ebp,esp
//调用Bob.f()方法
call dword ptr ds:[00975394h]
nop
pop ebp
ret
[注]00975394h是Bob.f()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址,该地址中的内容是对应的存根例程的开始地址。
f()的汇编显示为:
push ebp
mov ebp,esp
//调用Bob.c()方法
call dword ptr ds:[00975390h]
//调用Bob.b()方法
call dword ptr ds:[0097538Ch]
//调用Bob.a()方法
call dword ptr ds:[00975388h]
nop
pop ebp
ret
[注]00975390、0097538c、00975388分别为Bob.c()、Bob.b()、Bob.a()在CORINFO_CLASS_STRUCT该内部数据结构中对应的内存地址,该地址中的内容是对应的存根例程的开始地址。
相关文章
- 失控进化预约入口官网 预约地址及预约奖励一览 12-16
- 网页版邮箱登录入口全攻略及实用技巧大全 12-16
- 学习通网页版访问线路升级-一键直达课程界面更快捷 12-16
- 光与影33号远征队持久强力符文:符文持久强力的作用及获取方式详解 12-16
- 失控进化测试资格查询入口 失控进化测试资格申请攻略 12-16
- 豆包网页版多语言翻译实时入口-豆包网页版语音交互免下载直达 12-16