繁体   English   中英

JIT编译的缺点是什么?

[英]What are the downsides of JIT compilation?

及时编译具有许多理论上的优势:它有关于机器,标志状态以及代码使用方式的更多信息。 它允许您在运行之前避免耗时的编译,从而加快开发周期。

简单地说,JIT编译似乎是一种优越的方法; 有一些开销,但如果足够智能它可以加快你的代码足以抵消它。

但是,我不认为这就是整个故事。 理论和实践的缺点是什么? 是的,经常会提到“较慢的启动时间”,“增加的内存消耗”,但我想知道是否还有更多。

例如,跟踪和JIT编译会丢弃cpu缓存吗? 如果你的程序很大并且并没有真正有很多特别热门的路径,那么是否存在花费更多时间跟踪和JIT-ting的风险?

似乎有人写了一篇论文或解决JIT中固有的问题。 如果有人测量,那就更好了。

编辑:我正在谈论Just In Time编译与提前编译(可能是反馈导向优化)相比较,而不是与解释相比。

如果JIT工作正常,则没有真正的劣势。 话虽如此,Sun需要很长时间来稳定Hotspot,因为它非常复杂。 关于基准数据,您始终可以运行以下实验:

运行SPECjbb,SPECjvm或您自己的基准测试并修改执行java的命令行以包括:

-Xint

这将排除任何运行时编译。

例如,跟踪和JIT编译会丢弃cpu缓存吗? 如果你的程序很大并且并没有真正有很多特别热门的路径,那么是否存在花费更多时间跟踪和JIT-ting的风险?

这似乎是合理的。 但是整个优化游戏是关于利用各种因素进行交易以在一般情况下获得最佳结果。 大多数应用程序确实具有相对热和冷的路径,即使热路径都在标准类库中。

除了你实际上说的是这个假设的应用程序根本不值得JIT编译。 在这种情况下,“修复”将在关闭JIT编译的情况下运行它。

似乎有人写了一篇论文或解决JIT中固有的问题。

你会这么想的。

但另一方面,由于商业原因,在Oracle,IBM等JVM中构建和维护JIT编译器的人可能会被限制告诉全世界他们的想法和结果。 (发布源代码是一回事,但解释他们为什么选择特定策略是另一回事。)还有动机问题。

主要问题是当前VM必须加载 - 这是将整个编译器和运行时加载到内存中,因此它不会很快。

一旦加载,编译和分析可以在后台长期完成,理论上可以比任何静态编译的语言快得多,通过手工优化来适应运行时的情况。 (考虑一下函数被确定为没有副作用并且不依赖于使用相同参数调用50次的外部数据的情况 - 动态编译的语言可以简单地学习返回常量。这是某种东西。一个静态编译的语言根本无法做到。)

请注意,这并不一定会成为VM的问题,如果他们开始将虚拟机构建到操作系统中并在多个应用程序之间重用虚拟机,这个问题就会消失。

vm字节码也可以用更少的字节来做更多的事情。 这就是微软最初在Excel / Word(pre-java)中使用虚拟机的原因,它只是为了减少代码大小。

这部分只是猜想,但我认为这意味着可以优化自定义CPU以便更快地运行,因为读/写不会成为瓶颈。 RISC系统倾向于认为CPU操作而不是I / O是瓶颈,我不相信这总是正确的 - 在单个“操作码”中做更多的工作应该意味着CPU制造商有更多的机会来优化他们的硬件。

我的观点? 没有固有的缺点,主要的现实缺点是加载时间。

哦,另一个现实世界的缺点,Java和C#倾向于在堆上分配所有对象。 C#/ Java中的堆分配比使用C ++快得多,但仍然没有达到堆栈分配速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM