我现在正在学习V8内部原理。我了解到V8使用指针标记 https://en.wikipedia.org/wiki/Tagged_pointer用于值存储,但想知道为什么不使用 NaN 装箱。
AFAIK,NaN 拳击更好,因为它还可以存储双打,而不仅仅是 SMI。我读了this https://news.ycombinator.com/item?id=16985390,并理解(如果这是真的)为什么不在 32 位平台上使用 NaN 装箱。但在 64 位平台上我不明白为什么。
我怀疑原因与 SMI 有关。也许它们不能使用 NaN 拳击来存储?我认为他们可以。我们为它们准备了 52 个多余的位(我们甚至可以使用超过 32 位)。也许这需要额外的掩码操作,从而使整数数学变慢?但我们已经需要进行按位移位了!
我不知道为什么。感谢任何愿意回答的人。
(这里是 V8 开发人员。)NaN 装箱和指针标记是具有不同权衡的设计选择,严格来说,两者都不比另一个更好。 V8 使用指针标记的决定早在我加入该项目之前就已经做出了,所以我只能推测当时的具体原因是什么。
指针标记的优点是:
- 显着减少内存消耗(当然在 32 位平台上;使用“指针压缩 https://v8.dev/blog/pointer-compression" 在 64 位平台上也是如此)
- (小)整数运算效率稍高,因为大多数 CPU 的整数运算比双精度运算更快。一旦优化编译器介入,这可能就不再重要了。
- 指针操作的效率稍微高一些,因为您可以在访问对象字段时简单地添加调整后的偏移量(其性能与根本不玩任何指针技巧相同),而不是必须屏蔽 NaN 的不相关部分。一旦优化编译器介入,这可能就不再重要了。
正如您所指出的,NaN 标记的主要好处是它支持完整的双范围,这在某些情况下非常好。您可以基于任一技术构建性能良好的引擎。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)