在Visual Studio 2015 RC中启用RyuJIT

14
安装完Visual Studio 2015 RC1后,我加载了一个旧版ASP.NET项目并将.NET版本更改为4.6。该项目可以正常工作,但网站加载速度仍然像以前一样慢。我原本期望RyuJIT能够发挥作用,但显然没有。
我查看了关于RyuJIT的这个线程,但是在其中描述的任何方法中都找不到RyuJIT的任何痕迹。
同样的问题也出现在一个空的控制台项目中。我无法在输出窗口、模块窗口或运行中的Windows任务中看到Ryujit。
因此,要么RyuJIT无法像之前的预览版本那样被检测到,要么它没有运行。无论哪种情况,我都陷入了困境。
如何验证RyuJIT是否在VS 2015中运行,如果没有运行,我需要做些什么才能使它运行?

你知道RyuJIT只支持64位吗?也许你正在以32位运行? - leppie
@leppie:我正在使用Windows 8.1 x64进行控制台项目开发。在“Prefer 32 bit”复选框未勾选的情况下,我认为它是使用64位。在ASP.NET项目中,该复选框处于灰色状态,不确定其含义。 - Adrian Grigore
在.NET 4.6中,没有选择使用它的选项,它总是用于jit 64位代码。不要期望速度有所提高,因为这不是该项目的目标。 - Hans Passant
@Hans:当然了。微软一直在大力宣传这个。其中一个例子是:http://blogs.msdn.com/b/dotnet/archive/2013/11/18/ryujit-net-jit-compiler-ctp1-faq.aspx - Adrian Grigore
该链接指出改进64位的问题,这是来自非常低层次的严重问题,对于更需要内存的应用程序来说是一个严重的问题。 - user1496062
Adrian,我认为你不会在ASP.NET上看到加速,即使在启动时,IO成本也比jit/编译成本更重,并且大型的Microsoft库已经被ngen了。 - user1496062
3个回答

6

请看这里

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

摘自.NET Framework 4.6-使用RyuJIT进行测试

但是它应该默认激活

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

取自 .NET Framework 4.6 - 使用RyuJIT进行测试

为了测试目的,如果您在使用RyuJIT时遇到任何异常,可以通过app.config中的设置关闭它。这将使用旧的JIT64。

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

然而,RyuJIT CTP5目前无法在Visual Studio“14”CTP4上使用。无论如何,你也不需要它,因为Visual Studio“14” CTP4默认启用了RyuJIT。 :) (Visual Studio“14” CTP4中的RyuJIT版本略旧于此CTP,但差别不大。) 引用自RyuJIT CTP5:越来越接近发布,并具有更好的SIMD支持 我发现了一篇博客文章,可以在运行时确定所使用的JIT,但它考虑到了JIT64编译器中已知的错误。示例代码发布在此处。我不确定这是否是一种可靠的确定方法。

谢谢您的回复!在这种情况下,我想知道为什么RyuJIT似乎在编译速度方面没有任何作用。您有任何想法吗? - Adrian Grigore
@AdrianGrigore:不,我不确定。你的项目设置了什么平台目标?AnyCPU,x64? - Jehof
是的。该项目已设置为x64,“Prefer 32 Bit”已禁用,并且该项目正在Windows 8.1 x64上的IIS中运行。此外,如果我将构建目标设置为x86,则IIS将拒绝运行它。 - Adrian Grigore

6
首先,转到项目设置的 Debug 选项卡,并确保启用了本机代码调试。这样可以在 Visual Studio 的模块窗口中查看本机以及托管可执行文件。
现在在调试或发布模式下运行程序并打开模块窗口。你会看到以下两种情况之一:
- 只加载 clrjit.dll,这意味着 RyuJIT 用于编译所有托管代码。 - 或者同时加载 clrjit.dll 和 compatjit.dll,这意味着旧版 JIT64 编译器用于编译你的托管代码,而其他可执行文件中的托管代码可能使用任何一个编译器。
当启用回退机制时,将加载 compatjit.dll。否则,就不会加载。
请注意,如果安装了 .NET 4.6(又名 .NET 2015),即使你针对较早版本的框架进行了定位,RyuJIT 也将默认使用。
关于 RyuJIT vs JIT64。JIT64 生成的代码本身当前比 RyuJIT 生成的代码更快。因此,在这方面不要期望性能改进。另一方面,编译时间会有所变化。根据Microsoft的说法,RyuJIT 的编译时间可以比 JIT64 快高达 30%,也可能比 JIT64 慢高达 15%。因此,在这方面也不要期望性能改进。
但是,当 .NET 2015 发布时,情况可能会有所改变。 注意 如果目标平台为 "Any CPU",则必须取消构建选项卡中的 "Prefer 32-bit" 复选框。否则,将使用 x86 JIT。

谢谢你的回答! :) - Adrian Grigore

0

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

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


自从我安装了VS 2015 RC以来,编译时间并没有减少。我使用一台配备16GB RAM的计算机,还有大约5GB的额外内存可用,因此我不认为缺乏RAM是问题所在。 - Adrian Grigore

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