记录 CLR JIT 策略

2023-12-13

我想知道 CLR 适用于 JIT 编译的范围和顺序。

例如,如果我的应用程序仅调用给定类的单个方法,那么该类的未使用方法是否会不必要地进行 JIT 编译?如果是的话,它们是在执行我需要的一种方法之前全部编译的,还是在事后延迟编译的?

那么方法中的分支又如何呢? CLR 是否允许编译方法中的一半代码,同时允许同一方法中的单独分支在需要时保持未编译状态?

随着时间的推移,我似乎找到了一些文章来了解其中一些细节,但现在我没有找到任何内容来提供有关 CLR 如何以及何时选择 JIT 代码段的统一的、可读的摘要。有推荐的书籍或链接吗?

如果任何此类指南能够按 .net 版本分解此类 JIT 决策逻辑,那就最好了。


JIT 在 .NET 中的工作方式是,在方法被抖动之前,方法表条目指向一个小存根,该存根将在调用时对该方法进行 JIT。之后,方法表会更新以引用 JIT 编译代码的位置。

鉴于只有调用的方法才会进行 JIT 编译,因此未调用的方法不会产生 JIT 开销。

JIT 编译器将在需要时编译整个方法。如果是发布版本,则可以优化构建代码,但否则该方法将被完整编译。

您可以使用 WinDbg/SOS 检查方法表。考虑以下:

class SomeType
{
    public void Called()
    {
        Console.WriteLine("called");
    }

    public void NotCalled()
    {
        Console.WriteLine("not called");
    }
}

假设我们创建一个实例SomeType, call Called然后检查方法表SomeType。在 x86 上你会看到类似这样的内容:

0:000> !dumpmt -md 00a7381c
EEClass:         00a712d0
Module:          00a72e94
Name:            ConsoleApplication1.SomeType
mdToken:         02000002
File:            c:\temp\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
BaseSize:        0xc
ComponentSize:   0x0
Slots in VTable: 7
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
72ca4960 729a6728 PreJIT System.Object.ToString()
72c98790 729a6730 PreJIT System.Object.Equals(System.Object)
72c98360 729a6750 PreJIT System.Object.GetHashCode()
72c916f0 729a6764 PreJIT System.Object.Finalize()
00df00d8 00a73814    JIT ConsoleApplication1.SomeType..ctor()
00df0110 00a737fc    JIT ConsoleApplication1.SomeType.Called()
00a7c031 00a73808   NONE ConsoleApplication1.SomeType.NotCalled()

请注意Called是 JIT 编译的,但是因为我们还没有调用NotCalled然而,它还没有被 JIT 编译。

另外,请注意来自的方法object全部都经过 PreJIT 编译。

请记住,在发布版本中,可能会内联短方法,在这种情况下,它们不会作为方法调用,而只是作为调用站点生成的代码的一部分包含在内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录 CLR JIT 策略 的相关文章

随机推荐

  • 我的 ViewModel 中的 IEnumerable 未随 EditorForModel 显示

    视图模型 Validator typeof ProdutoCategoriaValidator public class ProdutoCategoriaViewModel HiddenInput DisplayValue false pu
  • 为什么PHP的explode错误?

    这是 PHP 代码 var dump value string 103 0e0cU 0Z dddd is moar awesome A6A32C2074B787893DF506F6F466F5919516C44F3 var dump exp
  • Raspberry Pi 无法在 JavaFX 应用程序中隐藏鼠标光标

    目前 我为 Raspberry Pi 3 开发 JavaFX 应用程序 为了在我的 PC 上进行开发 我使用 Ubuntu 16 04 1 OpenJDK 1 8 0 111 和 OpenJFX 8 0 60 对于 Raspberri Pi
  • Oracle 存储过程 OUT 参数

    我有一个存储过程 其 IN OUT 参数声明如下 create or replace PROCEDURE RIFATT SEGN0 INS pIdRifattSegn0 in OUT NUMBER pNumDossier IN VARCHA
  • 如何定义 Swagger 2.0 JSON 来填充 Swagger UI 中的默认主体参数对象?

    我们当前的部署模式要求我手动编写 swagger json 输出 该输出将由我公司使用的基于 Swagger 的 UI 使用 我希望我正在编写的 json 能够提供 默认 值来填充所有输入字段 包括 body 输入参数 的 Swagger
  • 无法通过angularjs在phonegap中显示联系人照片

    我能够从简单的 html 和 javascript 获取并显示联系人照片 但是当我使用 angularjs 模型显示联系人照片时 出现错误 以下是我的源代码 列出我尝试显示联系人的位置 ul class list li class item
  • 如何使用表单从数组动态创建复选框?

    我想使用代码根据传递给函数的数组或对象动态创建复选框 你能修改这个函数来获取数组吗 我有一个脚本 可以根据用户名查找可能的电脑名称并列出匹配项 如果有这个表格 让我能够选择列表中的结果之一作为正确的 PC 以移入正确的容器并安装软件 那就太
  • MySQL 删除重复行

    我有一个评论表 其结构如下 id name email comment 我有很多重复的评论 具有相同的姓名和电子邮件 我需要删除它们 任何人都可以建议我如何使用单个查询来实现此目的 Thanks DELETE FROM comments c
  • 用于在正在运行的 JVM 中打开调试的 Java API [重复]

    这个问题在这里已经有答案了 是否有一种编程方式可以在正在运行的 JVM 实例中打开调试 我正在寻找一个 API 它可以使运行中的 JVM 成为调试服务器 该 API 的作用相当于 Xdebug Xrunjdwp transport dt s
  • 暂停测试执行,直到应用程序空闲

    是否可以实现一些 util 方法来暂停测试 当前线程 执行 直到应用程序空闲 空闲的意思是 1 一段时间内没有GUI事件添加到事件队列中2 在同一时间段内没有工作线程运行任何任务 您能否提供实现 代码片段来跟踪以前的空闲情况 您可以更换Ev
  • 尝试合并 2 个数据帧但出现 ValueError

    这些是我保存在两个变量中的两个数据框 gt print df head gt club name tr jan tr dec year 0 ADO Den Haag 1368 1422 2010 1 ADO Den Haag 1455 14
  • 已删除的数据存储条目重新出现

    我想重新打开已删除的数据存储条目重新出现作为注册用户 老问题可以删除吗 这次我会尽量说得更具体 我遇到以下问题 最初 我将 N 个同类实体放入数据存储中 如下所示 datastore entity MyModel model propert
  • Perl 函数定义中的 $;$ 是什么意思? [复制]

    这个问题在这里已经有答案了 我得到以下代码 sub deg2rad my d DR 0 1 d rad2rad d 谁能告诉我什么 means 子声明后面括号中的内容称为原型 它们的解释在perlsub 一般来说 你can使用它们来限制编译
  • Android 蓝牙:软件导致连接中止

    每当我尝试将 Android 设备连接到支持蓝牙的设备时 我都会遇到异常 它正在连接 并且在一分钟之内就出现异常 要使用 BLuettoth 设备 Spp 配置文件 进行连接 我正在使用 Method m m mmDevice getCla
  • 在Java中将标签设置为图像格式问题

    我正在尝试将 java 程序中的标签设置为图像 然而 它似乎不适用于 bmp 图像 我正在寻找一个转换器 它允许我将图像从 bmp 转换为具有相同文件名的 jpg 这个转换器需要由java程序控制 其中有需要转换的图像的名称和位置 任何帮助
  • 使用 16 位整数的重要性

    开发人员在编写代码时如何认真考虑使用 16 位整数 自从我开始编程以来 我一直在使用 32 位整数 而且我并没有真正考虑过使用 16 位 声明 32 位 int 非常容易 因为它是大多数语言的默认值 使用 16 位整数部分来节省一点内存有什
  • 将Json反序列化为Asp.net中实现Ienumerable的类

    我有下面的函数 它获取 facebook 数据并将其作为字符串返回 public static string GetUserNewsFeed string strAccessToken Dictionary
  • 如何将事件传递给方法?

    我想创建一个方法 将事件作为参数并向其添加 eventHandler 以正确处理它 像这样 我有两个事件 public event EventHandler Click public event EventHandler Click2 现在
  • spring boot application.yml 属性在运行时发生变化

    在 Spring Boot 应用程序中 我可以使用 ConfigurationProperties 注释将 application yml 中的属性绑定到 bean 字段 是否可以在运行时更新 application yml 中的这些属性并
  • 记录 CLR JIT 策略

    我想知道 CLR 适用于 JIT 编译的范围和顺序 例如 如果我的应用程序仅调用给定类的单个方法 那么该类的未使用方法是否会不必要地进行 JIT 编译 如果是的话 它们是在执行我需要的一种方法之前全部编译的 还是在事后延迟编译的 那么方法中