我一直在阅读 JIT 和 LuaJIT 的跟踪编译器,特别是我遇到了一些问题。
据我了解,LuaJIT 的 JIT 不像 Java 的 HotSpot 那样编译热方法,它编译源自循环的热路径。这是否意味着如果某些东西不是源自循环(例如,我从 C-api 调用 Lua 函数),那么代码将永远不会被 jitted?当你遇到另一个循环时会发生什么?到第二个循环的路径是否会被 JIT,然后来自该循环的新路径也会被 jitted,或者第二个循环是否是同一路径的一部分?
解释器如何选择最优的热路径?假设我有一个整数哈希表 -> 字符串。现在想象一下,我已经调用 table[x] 并且 x 是 3 和 5 次,它们已经成为热路径并被 jitted,解释器如何决定为 x 为 4 的 table[x] 调用哪个 jitted 代码?
另一件事一直在绞尽脑汁。由于编译的是路径而不是函数,因此跟踪编译器不需要更多内存吗?因为你不能真正重用另一条路径的编译代码,我的意思是,因为在一般情况下,路径可能比单个函数大......