我想知道为什么JVM的JIT编译器会忽略编译中的"巨大方法".(除非该DontCompileHugeMethods标志设置为false.)与此同时,大多数关于Java的JIT编译器的讨论表明内联是一种超级优化,因为它允许增加大量需要编译的指令.这个更大的编译上下文允许更好地优化执行的代码.有了这个,我认为一个巨大的方法与一个内联方法很大不一样,应该是JIT编译的一个很好的目标.我在这里错过了什么?
基本上编译巨大方法的投资回报率很低。
热门代码段通常很短。
即使一个巨大的方法被频繁执行,热点部分也不太可能覆盖整个方法。例如,考虑一个大switch语句,其中case经常执行只有几个标签。然而,编译单元是一种方法——所以大部分 JITted 代码将是一种浪费。
编译庞大的方法需要很多时间和空间。此外,编译时间不会线性增长。改为编译几个小方法会更有利可图。
机器代码太长会污染指令缓存。
某些优化更适合应用于较小的代码段,例如寄存器分配或循环展开。
如果单个方法大于 8K 字节码,无论如何它似乎都写得不好。