Tag: jit

预编译的ASP.NET网站上的“JIT时间”的高,波动

使用预编译 (可更新)的150 * .dll ASP.NET网站,在应用程序预热后,“JIT时间百分比”的一些可能原因通常很高(> 60%)并且波动很长(访问所有function)并且没有应用程序重新启动或文件更改可能会生成新程序集? 可以预期,为该所有程序集生成的机器代码将在该app-domain的持续时间内重复使用。 缓存的机器代码量是否有限? 在什么情况下,同一个程序集需要在同一应用程序域中重新JIT? 或者是否必然会生成新的程序集? 内存压力等因素会影响性能指标吗? 参考 : http://forums.asp.net/p/967386/2959500.aspx

表达树生成的IL是否经过优化?

好吧,这只是好奇心,没有现实世界的帮助。 我知道使用表达式树,您可以像常规C#编译器一样动态生成MSIL。 由于编译器可以决定优化,我很想知道在Expression.Compile()期间生成的IL是什么情况。 基本上有两个问题: 因为在编译时编译器可以在调试模式和释放模式下产生不同的(可能是略微的)IL,在调试模式和发布模式下构建时通过编译表达式生成的IL是否存在差异? 此外,在运行时将IL转换为本机代码的JIT在调试模式和发布模式下都应该有很大的不同。 编译表达式也是如此吗? 或者来自表达树的IL根本没有被咬过? 我的理解可能有缺陷,请纠正我以防万一。 注意:我正在考虑分离调试器的情况。 我问的是Visual Studio中“debug”和“release”附带的默认配置设置。

我的32位头痛现在是64位偏头痛?!? (或64位.NET CLR运行时问题)

在64位JIT和32位JIT下运行.NET应用程序时,在性能,内存等方面出现了什么exception的意外后果? 我对好事感兴趣,但对人们遇到的令人惊讶的糟糕问题更感兴趣。 我正在编写一个新的.NET应用程序,它将部署在32位和64位。 关于移植应用程序的问题有很多问题 – 我不关心编程/移植角度的“陷阱” 。 (即:正确处理本机/ COM互操作,嵌入在结构中的引用类型,改变结构的大小等) 然而, 这个问题及其答案让我思考 – 我还有什么其他问题可以忽略? 有很多问题和博客文章绕过这个问题,或者涉及到它的一个方面,但我还没有看到任何编制了一个很好的问题清单。 特别是 – 我的应用程序非常受CPU限制并且具有巨大的内存使用模式(因此首先需要64位),以及本质上是图形化的。 我关心在64位Windows上运行的CLR或JIT中可能存在的其他隐藏问题(使用.NET 3.5sp1)。 以下是我目前了解的一些问题: ( 现在我知道了 )属性,甚至自动属性,都没有在x64中内联。 由于引用的大小,应用程序的内存配置文件也会更改,但也因为内存分配器具有不同的性能特征 启动时间可能会受到x64的影响 我想知道人们在64位Windows上的JIT中发现了哪些其他具体问题,以及是否有任何性能方面的解决方法。 谢谢你们! – – 编辑 – – – 只是为了澄清 – 我知道尽早尝试优化通常很糟糕。 我知道第二次猜测系统往往很糟糕。 我也知道64bit的可移植性有其自身的问题 – 我们每天在64位系统上运行和测试以帮助解决这个问题。 等等 但是,我的应用程序不是您典型的业务应用程序。 这是一个科学的软件应用程序。 我们有许多流程可以在所有核心(高度线程化)上使用100%CPU,每次数小时。 我花了很多时间来分析应用程序,这会产生很大的不同。 但是,大多数分析器都会禁用JIT的许多function,因此当您在分析器下运行时,内存分配,JIT中的内联等小细节可能很难确定。 因此我需要这个问题。

.NET JIT是否优化了空循环?

本文另有建议。 但是仍然需要评估循环条件。 java只是使用特定技巧来识别这种情况吗?

如何理解EMCA 335中关于`.locals init`的这些段落?

来自ECMA 335 I.12.4.1方法调用 局部变量数组对于对象类型以及包含对象的值类型中的字段始终为null。 此外,如果设置了.locals init ,则局部变量数组初始化为0表示整数类型,0.0表示浮点类型。 CLI不会初始化值类型,但validation的代码将作为方法入口点代码的一部分提供对初始化程序的调用。 所以 “对于整数类型初始化为0,对于浮点类型初始化为0.0”是否意味着“将值类型归零”? 这是否意味着:无论.locals init ,CLI必须始终确保在方法输入时将对象类型设置为null? 那么为什么它在这里区分对象类型和值类型:是不是零值类型类似于零对象类型? 如何理解“CLI没有初始化”值类型“? 这是什么意思:“经过validation的代码将提供对初始化程序的调用,作为方法入口点代码的一部分”? 不是CLI的validation部分吗? 来自ECMA 335 III.1.8.1.1validation算法 可validation的方法应具有.locals init set。 如果未设置,CLI可能会抛出VerificationException ,其中程序集尚未被授予SecurityPermission.SkipVerification 。 CLI可以选择执行明确的赋值分析(以确定在读取之前写入哪个位置),以允许CIL到本机代码编译器最小化其对此要求的性能影响。 如果设置了.locals init ,则规范要求CLI必须在方法输入时将局部变量数组归零。 这意味着归零机器代码需要在进入时执行。 那么,鉴于可能不必要的归零已经完成,“明确的分配分析”将如何帮助? 如果我不清楚,请道歉。 我会尽力根据评论改进我的问题。

JIT拒绝内联微小的方法

我缺少严肃的优化,因为JIT不会内联我的很多方法。 例如,让我们有以下代码: static void Main(string[] args) { IsControl(‘\0’); } public static bool IsControl(char c) { return ((c >= 0 && c = 127 && c <= 159)); } 在JIT编译之后生成以下内容: 0000001f xor ecx,ecx 00000021 call FFFFFFFFFFEC9760 00000026 mov byte ptr [rsp+20h],al 0000002a nop 0000002b jmp 000000000000002D 0000002d add rsp,38h 00000031 rep ret 请注意, 0000001f是我设置断点的地方。 如你所见,在00000021有一个电话,这是绝对错误的。 为什么这么小的方法不适合内联? […]

强制.NET JIT编译器在应用程序启动期间生成最优化的代码

我正在用C#编写一个DSP应用程序(基本上是一个多轨编辑器)。 我在不同的机器上进行了很长一段时间的分析,我注意到了一些“好奇”的东西。 在我的家用机器上,回放循环的第一次运行占用了可用时间的大约50%-60%,(我认为这是由于JIT正在完成其工作),然后对于后续循环,它会下降到稳定的5 % 消费。 问题是,如果我在较慢的计算机上运行应用程序,第一次运行占用的时间超过可用时间,导致播放中断并弄乱输出音频,这是不可接受的。 之后,它降至8%-10%的消费量。 即使在第一次运行之后,应用程序仍然不时地调用一些耗时的例程(每2秒或多或少),这导致稳定的5%消耗经历非常短的20%-25%的峰值。 我注意到如果我让应用程序运行一段时间,这些峰值也会下降到7%-10%。 (我不确定这是否是由于JIT重新编译这些代码部分)。 所以,我对JIT有一个严重的问题。 虽然应用程序即使在非常慢的机器中也能很好地运行,但这些“编译风暴”将成为一个大问题。 我试图弄清楚如何解决这个问题,我想出了一个想法,即用一个属性标记所有’明智的’例程,告诉应用程序在启动时预先“挤压”它们因此,当他们真正需要时,他们将完全优化。 但这只是一个想法(我也不太喜欢),我想知道是否有更好的解决方案来解决整个问题。 我想听听你们的想法。 (NGEN应用程序不是一个选项,我喜欢并希望我能获得所有JIT优化。) 编辑: 内存消耗和垃圾收集没有问题,我正在使用对象池,播放期间的最大内存峰值为304 Kb。

有没有办法让.Net JIT或C#编译器优化掉空的for循环?

.NET JIT是否会优化空循环? : 以下程序只运行十亿次空循环并打印出运行时间。 我的机器需要700毫秒,我很好奇是否有办法让抖动优化掉空循环。 using System; namespace ConsoleApplication1 { class Program { static void Main() { var start = DateTime.Now; for (var i = 0; i < 1000000000; i++) {} Console.WriteLine((DateTime.Now – start).TotalMilliseconds); } } } 据我所知,答案是否定的,但我不知道是否有隐藏的编译器选项,我可能没试过。 我确保在发布模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒才能运行此空循环。 我也试过NGEN同样的结果(虽然我的理解是它应该产生与JIT相同的编译代码,对吧?)。 但是我以前从未使用过NGEN,可能使用错了。 看起来这对于JIT来说很容易找到和优化,但是对于一般情况下抖动的工作知之甚少,我很好奇是否有一个特定的原因,这种优化会被遗漏。 VC ++编译器肯定似乎做了这个优化,所以我想知道为什么会出现这种差异。 有任何想法吗?

预加载所有组件(JIT)

我们正在第一次加载一些重型UI屏幕。 我们的项目分为一个主要的可执行文件和几个DLL文件。 DLL文件还可以包含UI屏幕,这些屏幕在第一次加载时很慢。 有没有办法(在代码中)我们可以预加载所有引用的程序集,以避免JIT编译命中? 我知道有一种名为NGen的工具。 是否有可能在开发环境中运行NGen,以便我们可以立即看到它的影响? 但理想情况下,我们希望从代码中预加载引用的程序集。 使用C#.NET 3.5和DevExpress作为UI组件。

如何validationryujit是否正在使用我的应用程序?

我已经为.NET RyuJit安装了新的Jit编译器,并按照安装文档中的描述在regedit中设置了.NetFramework中的AltJit = *键。 http://blogs.msdn.com/b/dotnet/archive/2013/09/30/ryujit-the-next-generation-jit-compiler.aspx 那么如何validationRyuJit实际上是否正在使用?