compiler-construction - 为什么 JIT 代码比编​​译或解释的代码消耗更多的内存?

标签 compiler-construction programming-languages jit pypy

编译后的代码如C消耗很少的内存。

解释码如Python消耗更多的内存,这是可以理解的。

使用 JIT,程序在运行时(有选择地)编译为机器代码。那么 JIT 程序的内存消耗不应该介于编译程序和解释程序之间吗?

相反,经过 JIT 处理的程序(例如 PyPy )比等效的解释程序(例如 Python )消耗的内存多几倍。为什么?

最佳答案

跟踪 JIT 编译器需要更多的内存,因为它们不仅需要保留 VM 的字节码,还需要保留可直接执行的机器代码。然而,这只是故事的一半。

大多数 JIT 还将保留大量有关字节码(甚至机器代码)的元数据,以允许他们确定哪些需要 JIT,哪些可以不做。跟踪 JIT(例如 LuaJIT)还创建跟踪快照,用于在运行时微调代码,执行循环展开或分支重新排序等操作。

有些还保留常用代码段的缓存或快速查找缓冲区以加快 JIT 代码的创建(LuaJIT 通过 DynAsm 执行此操作,如果正确完成,它实际上可以帮助减少内存使用量,就像 dynasm 的情况一样)。

内存使用在很大程度上取决于所使用的 JIT 引擎和它编译的语言的性质(强类型与弱类型)。一些 JIT 采用先进的技术,例如基于 SSA 的寄存器分配器和变量活跃度分析,这些优化也有助于消耗内存,以及更常见的事情,如循环变量提升。

关于compiler-construction - 为什么 JIT 代码比编​​译或解释的代码消耗更多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675490/

相关文章:

c++ - 方法调用后返回值是否总是进入 eax 寄存器?

oop - 您认为函数式语言适合具有大量业务规则但计算量很少的应用程序吗?

python - 当我使用 numba 的 "jit"装饰器运行代码时,Anaconda 提示符卡住

java - 解释字节码与编译字节码?

java - 及时编译 - 存储 vs 总是做

windows - 最好的 win32 编译脚本语言?

c++ - 为什么包括 guard ?

java - 如何将普通的java代码放入网站中

javascript - 除了 First Class Functions 和 Lexical Scoping,JavaScript 与 Scheme 实现有什么共同之处?

programming-languages - 可组合性在函数式编程中意味着什么?