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

3

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

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


我怀疑你的性能问题不是来自JIT编译器,最好检查一下你的代码并尝试重构它,不要浪费时间。 - mybirthname
1
这可能是一个有用的链接。.NET Runtime (CLR)和JIT编译器到底在哪里? 您可以查看每个服务器上的DLL文件版本,以查看是否存在差异。但我不确定这是否是RyuJIT 64位编译器的位置。 - Jason Evans
1
根据我的(有偏见的)经验,我怀疑那个特定服务器存在更明显的环境问题。可能是来自不同子网、缓慢的 DNS 服务器或新的病毒扫描引擎更新,也可能是旧的 .NET 安装。为了找出原因,您应该在该服务器上对应用程序进行分析。否则,由于使应用程序变慢的可能性太多,您很可能永远找不到根本原因。其中一种可能性是 .NET 4.6.0 安装存在 GC 性能错误。请参见 https://aloiskraus.wordpress.com/2016/07/31/when-known-net-bugs-bite-you/。 - Alois Kraus
感谢有帮助的评论。 - edeboursetty
显示剩余2条评论
2个回答

1

1

JIT版本

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

使用调试器确保您有新版本。首先,使用资源管理器查看运行时目录,在导航到C:\Windows\Microsoft.NET\Framework64\v4.0.30319。您会发现两个即时编译器,clrjit.dll是基于Ryujit项目的新即时编译器,而compatjit.dll是传统的x64即时编译器。

项目 > 属性 > 调试 > 选中“启用本机代码调试”选项。使用生成选项卡,确保已删除强制使用即时编译器的操作,“偏好32位”选项必须未选中,“平台目标”必须设置为AnyCPU。使用应用程序选项卡选择框架目标。

使用调试 > 逐步执行开始调试。调试 > 窗口 > 模块显示已加载模块列表。在该列表中找回即时编译器DLL,单击“名称”列标题以按名称排序。如果看到compatjit.dll,则正在使用传统即时编译器。请注意,您始终会看到clrjit.dll,当使用传统即时编译器时,它们都会加载。

[2] https://dev59.com/WlwZ5IYBdhLWcg3wYfZu#31534544

[2] https://dev59.com/WlwZ5IYBdhLWcg3wYfZu#31534544

JIT 架构

您可以通过检查运行应用程序是否为 64 位进程来确定使用的 JIT 架构。

Environment.Is64BitProcess

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

这个属性在64位和32位的mscorlib中分别作为直接的true/false返回实现。[1]

[1] https://dev59.com/z3RC5IYBdhLWcg3wUvQS#1913908


你认为“JIT”是什么意思? - CodeCaster
根据他们的问题,他们正在询问如何检测其进程中使用的x86或x64 JIT。Environment.Is64BitProcess属性可以确定这一点,因为它是硬编码为true/false,具体取决于已加载的mscorlib的架构。 - Scorpion
1
不,原帖作者声称该应用程序在64位的所有服务器上运行速度都很快,所以他们想看看那台服务器上的JIT编译器版本是否有所不同。您的回答也让人觉得“JIT”等同于“位数”。 - CodeCaster
注意,我已经编辑过了,以使得原始答案只涉及所使用的Jitter的架构更加清晰。 - Scorpion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接