多态内联缓存 (PIC) 通过按对象类型缓存实际方法来工作,以避免昂贵的查找过程(通常是哈希表查找)。
如果类型对象是可变的(即方法可能在运行时被猴子修补成不同的东西),如何处理类型比较?
我想出的一个想法是一个“类计数器”,每次调整一个方法时它都会递增,但是这似乎在一个大量修补猴子的环境中非常昂贵,因为它会杀死所有该类的 PIC,即使它们的方法没有改变。
我相信一定有一个很好的解决方案,因为这个问题直接适用于 JavaScript,据我所知,所有三个大型 JavaScript 虚拟机都有 PIC。
最佳答案
在 V8 中,我假设 monkeypatching 会更改对象的“隐藏类”(“映射”是 SELF 术语)。这在你猴子修补对象本身时会起作用。
如果你猴子修补类(你能做到吗?是 JS 吗?),我猜它会使所有 PIC 无效,因为这可能很少见。或者,它可能会重新编译旧方法以直接分派(dispatch)到新方法(我猜是在进行类型检查之后)
顺便说一句,我不认为其他“三巨头”实际上使用 PIC。我猜你指的是 squirrelfish 和 tracemonkey。前者是解释器,后者侧重于跟踪方法,我不记得听说过任何有关 PIC 的信息。事实上,我不认为 tracemonkey 对对象做了任何很酷的事情,但我可能是错的。
关于javascript - 多态内联缓存如何与可变类型一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053084/