问题标签 [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 投票
3 回答
800 浏览

java - Java 和 .NET 堆开销

我了解堆和垃圾收集器的工作原理:垃圾收集分代发生,内存分配顺序发生,在垃圾收集期间通过移动数据和形成连续块等压缩空闲/未使用空间等。

是否存在已分配内存块的标头以及它们有多大(我听说 .NET CLR 是 8-16 个字节)以及是否存在字节、字或四字对齐?我对 x86 和 x64 处理器架构的 JIT (Java) 和 CLR (.NET Framework 或 Mono) 实现的任何信息感兴趣。

0 投票
11 回答
9061 浏览

c# - JIT 编译器与离线编译器

是否存在 JIT 编译器比 C++ 等其他编译器更快的情况?

你认为未来 JIT 编译器只会看到一些小的优化、特性但遵循类似的性能,还是会有突破,使其无限优于其他编译器?

看起来多核范式有一些希望,但它不是通用的魔法。

有什么见解吗?

0 投票
5 回答
1124 浏览

c# - Does .NET JIT optimize empty loops away?

This article suggests otherwise. But there is still a need to evaluate the loop condition. Does java just employ a specific trick to recognize this case?

0 投票
7 回答
1500 浏览

c# - 如何编写不会被编译器/JIT 优化的(测试)代码?

我不太了解编译器和 JIT 优化的内部原理,但我通常会尝试使用“常识”来猜测哪些可以优化,哪些不能。所以我今天写了一个简单的单元测试方法:

这种方法实际上是我所需要的。它检查默认构造函数是否存在并无异常运行。

但后来我开始考虑编译器/JIT 优化的效果。编译器/JIT 能否通过完全消除该new MyObject();语句来优化此方法?当然,它需要确定调用图对其他对象没有副作用,这是简单初始化对象内部状态的普通构造函数的典型情况。

我认为只有 JIT 可以执行这样的优化。这可能意味着这不是我应该担心的事情,因为测试方法只执行一次。我的假设正确吗?

不过,我正在尝试考虑一般主题。当我想到如何防止这个方法被优化时,我想我可以assertTrue(new MyObject().toString() != null),但这非常依赖于toString()方法的实际实现,即使这样,JIT 也可以确定该toString()方法总是返回一个非空字符串(例如如果实际Object.toString()被调用),从而优化整个分支。所以这种方式行不通。

我知道在 C# 中我可以使用[MethodImpl(MethodImplOptions.NoOptimization)],但这不是我真正想要的。我希望找到一种(与语言无关的)方法来确保我的代码的某些特定部分实际上会按我的预期运行,而 JIT 不会干扰这个过程。

此外,在创建单元测试时,我应该注意哪些典型的优化案例?

非常感谢!

0 投票
2 回答
2223 浏览

jit - JIT 编译和 DEP

我正在考虑尝试一些 jit 编译(只是为了学习),让它跨平台工作会很好,因为我在家里运行所有主要的三个(windows、os x、linux)。考虑到这一点,我想知道是否有任何方法可以摆脱使用虚拟内存窗口函数来分配具有执行权限的内存。最好只使用 malloc 或 new 并将处理器指向这样的块。

有小费吗?

0 投票
7 回答
31743 浏览

c# - CLR 与 JIT

JIT 编译器和 CLR 有什么区别?如果您将代码编译为 il 并且 CLR 运行该代码,那么 JIT 在做什么?随着向 CLR 添加泛型,JIT 编译发生了怎样的变化?

0 投票
4 回答
982 浏览

c# - 关闭 JIT,并控制 MSIL(自己的 VM)中的代码流

我正在用 C# 编写自己的脚本语言,具有一些我喜欢的特性,并且我选择使用 MSIL 作为输出的字节码(Reflection.Emit 非常有用,我不必想出另一个字节码)。它可以工作,发出可执行文件,可以运行(甚至可以使用 Reflector 反编译 :))并且速度非常快。

但是 - 我想在一个进程+一个线程中运行多个“进程”,并手动控制它们分配的 CPU 时间(也实现由 .NET 框架提供的更强大的 IPC)有没有办法完全禁用 JIT 并创建自己的VM,使用.NET框架(并控制内存使用等)在指令后步进指令,无需自己编写任何东西,或者要实现这一点,我必须编写整个MSIL解释?

编辑 1): 我知道解释 IL 并不是世界上最快的事情:)

编辑2):澄清-我希望我的VM成为某种“操作系统”-它获得一些CPU时间并将其分配给进程,控制它们的内存分配等等。它不必很快,也不必有效,而只是我的一些实验的概念证明。我不需要在处理每条指令的级别上实现它 - 如果这应该由 .NET 完成,我不会介意,我只想说:第一步指令,等到我告诉你下一步。

编辑 3):我意识到,ICorDebug 可能可以满足我的需求,现在正在查看 Mono 运行时的实现。

0 投票
8 回答
2251 浏览

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

从在 64 位 JIT 和 32 位 JIT 下运行 .NET 应用程序切换时,在性能、内存等方面发生了哪些不寻常的、意想不到的后果?我对好的方面感兴趣,但对人们遇到的令人惊讶的坏问题更感兴趣。

我正在编写一个新的 .NET 应用程序,它将同时部署在 32 位和 64 位上。与移植应用程序有关的问题有很多问题 -从编程/移植的角度来看,我并不关心“陷阱”。(即:正确处理本机/COM 互操作、嵌入在结构中的引用类型改变结构的大小等)

然而,这个问题及其答案让我思考——我忽略了哪些其他问题?

有很多问题和博客文章绕开了这个问题,或者触及了它的一个方面,但我还没有看到任何东西可以汇编出一份体面的问题清单。

特别是 - 我的应用程序非常受 CPU 限制,并且具有巨大的内存使用模式(因此首先需要 64 位),并且本质上是图形化的。我担心在 64 位 Windows(使用 .NET 3.5sp1)上运行的 CLR 或 JIT 中可能存在哪些其他隐藏问题。

以下是我目前知道的几个问题:

我想知道人们在 64 位 Windows 上的 JIT 中发现了哪些其他具体问题,以及是否有任何性能变通方法。

谢谢你们!

- - 编辑 - - -

只是为了澄清 -

我知道尝试及早优化通常是不好的。我知道第二次猜测系统通常是不好的。我也知道 64 位的可移植性有其自身的问题——我们每天在 64 位系统上运行和测试以帮助解决这个问题。等等

但是,我的应用程序不是您的典型业务应用程序。这是一个科学的软件应用程序。我们有许多进程在所有内核(它是高度线程化的)上一次使用 100% 的 CPU 数小时。

我花了很多时间来分析应用程序,这会产生很大的不同。但是,大多数分析器禁用了 JIT 的许多功能,因此当您在分析器下运行时,可能很难确定内存分配、JIT 内联等小细节。因此我需要这个问题。

0 投票
4 回答
3516 浏览

c# - C# 编译器或 JIT 在什么级别优化应用程序代码?

我想知道这些信息以减少我的代码大小,这样我就不会浪费我的时间来优化将由编译器或 JIT 完成的事情。

例如:

如果我们假设编译器内联对属性的 get 函数的调用,那么我不必将返回值保存在局部变量中以避免函数调用。

我想推荐一个很好的参考来描述发生了什么?

0 投票
1 回答
563 浏览

c# - JIT 编译如何用于缓存?

当你用 C# 编写一个应用程序,然后运行它时,它会不会在下次运行时再次编译,或者每次应用程序启动时都会重新编译使用的所有内容?

JIT 编译如何用于缓存?