哪个 JIT 正在运行我的应用程序

Posted

技术标签:

【中文标题】哪个 JIT 正在运行我的应用程序【英文标题】:Which JIT is running my application 【发布时间】:2016-10-03 14:57:31 【问题描述】:

我正在尝试调查一个性能问题,即应用程序在我们的一台服务器上以 64 位运行时运行缓慢,而在同一台计算机上以 32 位运行或在其他任何地方以 64 位运行时运行快速。

我发现这可能与所使用的 JIT 编译器有关。有没有办法告诉我正在使用哪个 JIT 编译器来运行我的应用程序?我想看看它在服务器上与在 64 位版本工作正常的其他计算机上是否不同。

【问题讨论】:

我怀疑你的性能问题来自 JIT 编译器,最好检查你的代码并尝试重构它,不要浪费时间。 不确定如何判断哪个是活动的,但您当然应该明确尝试enabling/disabling RyuJIT 并比较性能。它有一些错误,因此可能会出现性能问题。 这可能是一个有用的链接。 Where exactly is .NET Runtime (CLR), JIT Compiler located? 您可以查看每个服务器上的 DLL 文件版本,看看是否有差异。我不确定这是否是 RyuJIT 64 位编译器的位置。 相关How do I verify that ryujit is jitting my app? 根据我的(有偏见的)经验,我怀疑该特定服务器存在更明显的环境问题。它可能是来自不同子网的任何东西、那里的慢速 DNS 服务器或新的病毒扫描引擎更新(错误或旧的 .NET 安装)。要找出这一点,您应该在该服务器上分析您的应用程序。否则,您很可能永远找不到根本原因,因为有很多可能性会使您的应用程序变慢。一种可能是 .NET 4.6.0 安装存在 GC 性能错误。见aloiskraus.wordpress.com/2016/07/31/… 【参考方案1】:

JIT 版本

您可以按照 Hans 的步骤验证 RyuJIT 是否已加载到您的应用程序中。 [2]

使用调试器确保您拥有新版本。首先使用资源管理器查看运行时目录,导航到 C:\Windows\Microsoft.NET\Framework64\v4.0.30319。您会在那里找到两个抖动,clrjit.dll 是基于 Ryujit 项目的新抖动,而 compatjit.dll 是旧版 x64 抖动。

项目>属性>调试>勾选“启用本机代码调试选项”。使用 Build 选项卡并确保您已删除强制抖动,必须取消选中“Prefer 32-bit”选项,必须将“Platform target”设置为 AnyCPU。并使用 Application 选项卡选择框架目标。

使用 Debug > Step Into 开始调试。 Debug > Windows > Modules 显示已加载模块的列表。在该列表中找到抖动 DLL,单击“名称”列标题以按名称排序。如果您看到 compatjit.dll,那么您使用的是旧版抖动。请注意,您总是会看到 clrjit.dll,它们都是在使用旧版抖动时加载的。

[2]https://***.com/a/31534544/102351


JIT 架构

您可以通过检查正在运行的应用程序是否为 64 位进程来确定所使用的 JIT 的体系结构。

Environment.Is64BitProcess

https://msdn.microsoft.com/en-us/library/system.environment.is64bitprocess.aspx

此属性分别在 64 位和 32 位版本的 mscorlib 中实现为直接真/假返回。 [1]

[1]https://***.com/a/1913908

【讨论】:

你认为“JIT”是什么意思? 根据他们的问题,他们询问如何检测他们的流程中是否使用了 x86 或 x64 JIT。 Environment.Is64BitProcess 属性可以确定这一点,因为它根据加载的 mscorlib 的体系结构硬编码为真/假。 不,OP 声称该应用程序在除一台 64 位服务器之外的所有服务器上运行速度都很快,因此他们想查看该服务器上的 JIT 编译器版本是否不同。你的回答也让人觉得“JIT”等于“bitness”。 注意,我已经对其进行了编辑,以更清楚地表明原始答案仅指所使用的抖动的体系结构。【参考方案2】:

使用 JIT 性能计数器 (https://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.110).aspx#jit) 来监控代码何时被执行。

您可以使用 ngen (https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx) 通过消除对 JIT 代码的需要来缩短应用程序启动时间 - ngen 将程序集预编译为本机映像。

【讨论】:

以上是关于哪个 JIT 正在运行我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

IOS上的Qt QML应用程序运行缓慢,JIT被禁用

JIT(上):Tensorflow如何实现即时编译?

『GCTT 出品』使用 Go 语言写一个即时编译器(JIT)

JIT是什么,它将怎样运行?

什么是 JIT ?

用于生成最佳代码的 NVCC 编译选项(使用 JIT)