在 Visual Studio 2015 RC 中启用 RyuJIT

Posted

技术标签:

【中文标题】在 Visual Studio 2015 RC 中启用 RyuJIT【英文标题】:Enabling RyuJIT in Visual Studio 2015 RC 【发布时间】:2015-05-04 10:39:20 【问题描述】:

安装 Visual Studio 2015 RC1 后,我加载了一个旧的 ASP.NET 项目并将 .NET 版本更改为 4.6。该项目运行良好,但网站仍然像往常一样缓慢加载。我原以为 RyuJIT 会加入,但显然不是。

我查看了关于 RyuJIT 的 this thread,但我看不到任何 RyuJIT 的痕迹,其中描述的任何方法。

空的控制台项目也会出现同样的问题。我在输出窗口、模块窗口或正在运行的 Windows 任务中看不到 Ryujit。

因此,要么像以前的预览版那样无法检测到 RyuJIT,要么它没有运行。不管怎样,我被困住了。

如何验证 RyuJIT 是否在 VS 2015 中运行,如果不是,我必须做什么才能使其运行?

【问题讨论】:

你知道 RyuJIT 只有 64 位吗?也许您以 32 位运行? @leppie:我正在使用 Windows 8.1 x64。在控制台项目中。 “首选 32 位”复选框未选中,因此我假设它使用的是 64 位。在 ASP.NET 项目中,那个复选框是灰色的,不知道是什么意思。 在 .NET 4.6 中没有使用它的选项,它总是用于 jit 64 位代码。 不要期望速度提高,这不是项目的目标。 @Hans:当然是。 MS一直在大力宣传这一点。众多示例之一:blogs.msdn.com/b/dotnet/archive/2013/11/18/… 那个链接说改进 64 位,这是来自非常低的级别,这对于更多内存消耗的应用程序来说是一个严重的问题。 【参考方案1】:

首先,转到项目的设置,调试选项卡并确保已启用本机代码调试。这使您可以在 Visual Studio 的“模块”窗口中查看本机和托管可执行文件。

现在在调试或发布模式下运行程序并打开模块窗口。您将看到以下两种情况之一:

要么只加载 clrjit.dll,这意味着正在使用 RyuJIT 编译所有托管代码。 或者 clrjit.dll 和 compatjit.dll 都已加载,这意味着旧版 JIT64 编译器用于编译您的托管代码,而其他可执行文件中的托管代码可能使用任一编译器。

compatjit.dll 在启用fallback mechanism 时加载。否则,它不会加载。

请注意,如果您安装了 .NET 4.6(又名 .NET 2015),那么即使您针对的是较旧版本的框架,也会默认使用 RyuJIT。

关于 RyuJIT 与 JIT64。 JIT64 本身生成的代码目前比 RyuJIT 生成的代码要快。所以不要指望这方面的性能改进。另一方面,编译时间各不相同。根据Microsoft 的说法,RyuJIT 的编译时间可以比 JIT64 快 30%, 最多 15%。所以也不要指望这方面的性能提升。

不过,当 .NET 2015 发布时,情况可能会有所改变。

注意

如果目标平台是“任何 CPU”,则必须取消选中“构建”选项卡中的“首选 32 位”复选框。否则,将使用 x86 JIT。

【讨论】:

感谢您的回答! :)【参考方案2】:

给你

安装后,有两种方法可以开启 RyuJIT。如果您只想为一个应用程序启用 RyuJIT,请设置一个环境变量:COMPLUS_AltJit=*。如果要为整台机器启用 RyuJIT,请将注册表项 HKLM\SOFTWARE\Microsoft.NETFramework\AltJit 设置为字符串“*”。这两种方法都会导致 64 位 CLR 使用 RyuJIT 而不是 JIT64。两者都是临时设置——安装 RyuJIT 不会对您的机器进行任何永久性更改(除了将 RyuJIT 文件安装在目录中。)

取自.NET Framework 4.6 - Testing with RyuJIT

但是应该默认开启

.NET Framework 4.6 包括用于 64 位进程的新即时 (JIT) 编译器,称为 RyuJIT。默认情况下启用。它仍然是预览版,因此您可能会发现尚未修复的问题。

取自.NET Framework 4.6 - Testing with RyuJIT

出于测试目的,如果您遇到任何 RyuJIT 异常,您可以使用 app.config 中的设置将其关闭。这使用较旧的 JIT64。

<configuration>
 <runtime>
  <useLegacyJit enabled="1">
 </runtime>
</configuration>

但是,RyuJIT CTP5 目前无法在 Visual Studio“14”CTP4 上运行。无论如何你都不需要它,因为 RyuJIT 在 Visual Studio "14" CTP4 上默认启用。 :) (Visual Studio "14" CTP4 中的 RyuJIT 版本比这个 CTP 稍旧,但相差不大。)

取自RyuJIT CTP5: Getting closer to shipping, and with better SIMD support

我找到了一篇博客文章来确定运行时使用的 JIT,但它考虑了 den JIT64 编译器中的一个已知错误。示例代码发布在here。我不确定这是否是确定它的可靠方法。

【讨论】:

感谢您的回复!在那种情况下,我想知道为什么 RyuJIT 在编译速度方面似乎没有做任何事情。你知道为什么会这样吗? @AdrianGrigore:不,我不确定。为您的项目设置了什么平台目标? AnyCPU,x64? 是的。该项目设置为 x64,“首选 32 位”已禁用,并且该项目正在 Windows 8.1 x64 上的 IIS 中运行。另外,如果我将构建目标设置为 x86,IIS 会拒绝运行它。【参考方案3】:

RyuJIT 在编译代码时会自动激活,这只是一个在 64 位模式下运行的编译器,可以访问 RAM 以将编译速度提高 30%,而在 JIT 编译器中花费的时间只是启动时间的一个组成部分,所以应用程序不会因为 JIT 快一倍而启动快一倍。

您可以检查您当前的 ram 内存状态和运行进程,如果可用内存足够,则它必须运行得更快,否则需要考虑时间来考虑内存分配。

【讨论】:

因为我安装了 VS 2015 RC,编译时间也没有减少。我正在使用 16 GB RAM 的计算机,还有大约 5 GB 的额外内存可用,所以我不认为缺少 RAM 是问题。

以上是关于在 Visual Studio 2015 RC 中启用 RyuJIT的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2015在.NET Core RC2项目中的一个错误。

如何使用 Visual Studio 2015 rc 编译 7-zip

无法在 Visual Studio 2017 RC 中添加全局 JavaScript Intellisense 引用

用于 bower.json 文件的 Visual Studio 2015 RC 上的 Intellisense 无法正常工作。

Gitignore 不会忽略 Windows7/8 上 Visual Studio 2015 RC 的 .vs 文件夹

适用于 Android 的 Visual Studio 2015 RC 模拟器无法启动