问题标签 [jit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
760 浏览

c# - JIT 如何知道在哪里寻找 csc.exe?

JIT 如何知道在哪里寻找 csc.exe?此外,其他 .NET 语言(如 IronRuby)如何处理这个问题?

0 投票
5 回答
2981 浏览

asp.net - 当只有一件事发生变化时,为什么 ASP.NET 会重新编译(重新 JIT)所有​​内容?

我有一个 ASP.NET 2.0 应用程序(从 MSI 安装在 IIS 6.0 上),它被编译为“网站”,并在 Visual Studio 2005 中使用 Web 部署项目进行预编译/打包。(我已提出请求开发人员考虑更改为下一个版本的 Web 应用程序,但不会更改此版本)。

每当应用程序被回收(例如,对 web.config 进行更改)时,第一次命中时,ASP.NET JITs 应用程序。作为其中的一部分,它获取登录页面所需的所有程序集,并将它们编译为 Temporary ASP.NET Files 'assembly\dl3' 目录中的本机代码,这需要 20 到 60 秒。这只发生在回收站上,这种情况很少发生——但是当它发生时,它会导致页面加载时间更长,我相信有可能对此进行优化。

似乎有 122 个 DLL 需要考虑,其中一些是预编译的代码隐藏,其他是网站的第三方组件(例如 NHibernate.dll、报告组件等)

为什么它要重新编译/重新 JIT一切?为什么它没有检测到大多数程序集没有更改,并且没有尝试更改它们?我可以证明导致问题的不是批处理编译吗?(我<compilation debug="false"在 web.config 中设置了 >。)

其他问题表明 NGEN 可能有用,但我读到无法在 ASP.NET 1.x 上使用它;我们使用的是 2.0,无论哪种方式我都找不到一个干净的答案。

0 投票
1 回答
550 浏览

.net - 可共享页面中的 .NET JIT 程序集

在终端服务环境中运行 .NET 2.0 WinForms 应用程序时,我看到了一些我无法解释的意外结果。我读过的所有内容都表明,JIT 程序集(即不使用 NGen 创建本机图像)导致所有代码空间都存储在私有页面中,从而增加了工作集大小/内存压力。然而,实际结果(使用 Process Explorer、VMMap 和 WinDbg 验证)表明,即使是 JIT 程序集也确实被放置在可共享页面中(并且当有多个应用程序实例运行时,即使在单独的 TS 下也确实是共享的会话/用户)。

谁能解释为什么会这样?这是在 W2K8 服务器环境中运行的,因此 ASLR 解释了为什么每个程序集缺少特定的基地址以及由此产生的变基不会导致问题。尽管如此,这些不是本机 PE 映像的事实似乎应该导致这些程序集的代码存储在私有页面中。

当我们开始研究使用 NGen 来减少内存压力时发现了这一点,但实际上发现它增加了工作集的大小——因为 JIT 的程序集已经被共享。

我发现的最新参考资料在这里,这又与我们的实际发现不同:

http://blogs.msdn.com/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

编辑:我应该补充一点,自从第一次发布问题以来,Windows Server 2003 测试盒上的更多实验也显然表明 JIT 的程序集在进程之间是可共享的。我仍然很难理解为什么我能找到的所有建议都表明 NGen 是必需的,但所有现实世界的证据都与此相矛盾。我真的希望这里的专家能提供一些启示。

谢谢!

编辑:我已经把我所有的 .NET / CLR 书籍都掸掉了,但我已经没有办法尝试解决这个问题了;谁会通过帮助消除“我不明白发生了什么”的那种可怕的唠叨感觉来度过我的一天!?!:)

0 投票
4 回答
4714 浏览

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

我正在用 C# 编写一个 DSP 应用程序(基本上是一个多轨编辑器)。我已经在不同的机器上对它进行了很长一段时间的分析,我注意到了一些“好奇”的东西。

在我的家用机器上,播放循环的第一次运行占用了大约 50%-60% 的可用时间(我认为这是由于 JIT 完成了它的工作),然后对于后续循环,它会下降到稳定的 5 % 消耗。问题是,如果我在较慢的计算机上运行应用程序,第一次运行占用的时间超过可用时间,导致播放中断并弄乱输出音频,这是不可接受的。之后,它下降到 8%-10% 的消耗。

即使在第一次运行之后,应用程序也会不时地调用一些耗时的例程(或多或少每 2 秒一次),这导致稳定的 5% 消耗经历了 20%-25% 的非常短的峰值。我注意到,如果我让应用程序运行一段时间,这些峰值也会下降到 7%-10%。(我不确定这是否是由于 JIT 重新编译了这些代码部分)。

所以,我对 JIT 有一个严重的问题。虽然应用程序即使在非常慢的机器上也能很好地运行,但这些“编译风暴”将是一个大问题。我试图弄清楚如何解决这个问题,我想出了一个想法,即用一个属性标记所有“合理”例程,该属性将告诉应用程序在启动期间预先“挤压”它们,因此在真正需要时会对其进行全面优化。但这只是一个想法(我也不太喜欢它),我想知道是否有更好的解决方案来解决整个问题。

我想听听你们的想法。

(NGEN 应用程序不是一个选项,我喜欢并想要我可以获得的所有 JIT 优化。)

编辑:

内存消耗和垃圾回收不是问题,我使用的是对象池,播放期间的最大内存峰值为 304 Kb。

0 投票
7 回答
9060 浏览

c++ - 静态语言的运行时优化:C++ 的 JIT?

是否有人使用 JIT 技巧来提高静态编译语言(如 C++)的运行时性能?似乎基于运行时观察的热点分析和分支预测可以提高任何代码的性能,但也许有一些基本的战略原因使得在运行时进行这种观察和实施更改只能在虚拟机中进行。我清楚地记得在听动态语言爱好者谈论收集统计数据和重新排列代码时无意中听到 C++ 编译器作者喃喃地说“你也可以为用 C++ 编写的程序做这件事”,但我的网络搜索支持这种记忆的证据已经枯竭。

0 投票
1 回答
4644 浏览

c# - 需要帮助从 .NET JITted 代码中破译一行汇编代码

在 C# 构造函数中,最终调用this(...),实际调用被转换为:

这里的 DS 寄存器内容是什么?我知道这是数据段,但是这个调用是通过 VMT 表还是类似的?不过我对此表示怀疑,因为this(...)不会调用虚拟方法,而只是调用另一个构造函数。

我问是因为该位置的值在某种程度上似乎很糟糕,如果我按 F11,跟踪到(Visual Studio 2008),在该调用指令上,程序会因访问冲突而崩溃。

该代码位于第 3 方控件库的深处,虽然我有源代码,但我没有使用足够的调试信息编译的程序集,我可以通过 C# 代码跟踪它,只能通过反汇编程序,然后我有将其与实际代码相匹配。

有问题的 C# 代码是这样的:

Reflector 向我展示了这个 IL 代码:

正是最后一次调用同一类的另一个构造函数失败了。调试器永远不会出现在其他方法中,它只会崩溃。

JITting之后的方法反汇编是这样的:

基本上我要问的是:

  • ds:[ADDR]这里间接的目的是什么?VMT-table 仅用于虚拟不是吗?这是构造函数
  • 构造函数是否还没有被 JITted,这可能意味着调用实际上会通过 JIT shim 调用?恐怕我在这里深陷困境,所以任何事情都可能而且可能会有所帮助。

编辑:嗯,问题只是变得更糟,或者更好,或者其他什么。

我们正在 Visual Studio 2008 解决方案中的 C# 项目中开发 .NET 功能,并通过 Visual Studio 进行调试和开发。

但是,最终,此代码将加载到由 Win32 Delphi 应用程序托管的 .NET 运行时中。

为了方便对这些功能进行实验,我们还可以配置Visual Studio项目/解决方案/调试器,将生成的dll复制到Delphi应用程序的目录,然后通过Visual Studio调试器执行Delphi应用程序。

事实证明,如果我在调试器之外运行程序,问题就会消失,但在调试期间,它每次都会出现。

不确定这是否有帮助,但由于代码不会在另外 6 个月左右的时间内用于生产发布,因此我们很快就会为测试发布减轻一些压力。

稍后我将深入研究内存部分,但可能要到周末,然后发布后续内容。

0 投票
1 回答
1022 浏览

clr - CLR 支持哪些 JIT 编译器

我偶然发现了这句话:

“.NET 公共语言运行时 (CLR) 为每个支持 NET 的计算机架构提供至少一个 JIT 编译器,因此同一组 CIL 可以进行 JIT 编译并在不同的架构上运行。”

我环顾四周,但找不到 CLR 支持的 JIT 编译器的明确列表?

0 投票
4 回答
529 浏览

java - 我应该查看 java 编译器生成的字节码吗?

No

  • 无论如何,JIT 编译器可能会将字节码“转换”成完全不同的东西。
  • 它将导致您进行过早的优化。

Yes

  • 您不知道 JIT 将编译哪种方法,因此最好将它们全部优化。
  • 它会让你成为一个更好的Java程序员。

我是在不知道(显然)的情况下问的,所以请随意重定向到 JIT 超链接。

0 投票
3 回答
870 浏览

python - C中的Python风格迭代器

python 中的“yield”语句允许从过程中进行简单的迭代,这也意味着不需要预先计算序列并将其存储在“任意”大小的数组中。

是否有类似的方法从 C 过程中迭代(使用产量)?

0 投票
5 回答
235 浏览

.net - 任何指向最小 CLI 运行时的指针?

我正在寻找可能的最小 CLI 子集实现。

现在,即使是解释器也可以,但我真的在寻找 JITted 运行时。除了 System.Object 和 Enum 等核心类之外,我什至不需要标准运行时中的任何东西。它还需要可移植并且对底层系统的依赖最少。

我考虑过单声道,它很重。将单声道减少到我的要求是一项艰巨的任务。我想知道它是否已经完成了。我目前正在查看 pnet,其中包括一个“小型”构建。