【问题标题】:Why does V8 uses pointer tagging and not NaN boxing?为什么 V8 使用指针标记而不是 NaN 装箱?
【发布时间】:2020-08-23 19:02:25
【问题描述】:

我现在正在学习 V8 内部。我了解到 V8 使用 pointer tagging 进行值存储,但想知道为什么它不使用 NaN 装箱。

AFAIK,NaN 拳击更好,因为它还可以存储双打,而不仅仅是 SMI。我已经阅读了this,并且了解(如果这是真的)为什么不在 32 位平台上使用 NaN 装箱。但在 64 位平台上,我不明白为什么。

我怀疑原因与 SMI 有关。也许它们不能使用 NaN 拳击存储?我认为他们可以。我们有 52 个多余的位(我们甚至可以使用超过 32 位)。也许这将需要额外的掩码操作,这会使整数数学变慢?但是我们已经需要进行移位了!

我不知道为什么。感谢愿意回答的人。

【问题讨论】:

    标签: pointers optimization v8 javascript-engine nan-boxing


    【解决方案1】:

    (此处为 V8 开发人员。)NaN 装箱和指针标记是具有不同权衡的设计选择,严格来说,两者都不比另一个更好。 V8 使用指针标记的决定早在我加入项目之前就已经做出,所以我只能推测当时的具体原因可能是什么。

    指针标记的优点是:

    • 显着减少内存消耗(当然在 32 位平台上;在 64 位平台上也有“pointer compression”)
    • 更高效(小)整数运算,因为大多数 CPU 的整数运算比它们的双精度运算更快。一旦优化编译器进入画面,这可能根本不重要。
    • 稍微更有效的指针操作,因为您可以在访问对象字段时简单地添加一个调整后的偏移量(其性能与根本不播放任何指针技巧相同),而不是必须屏蔽 NaN 的不相关部分。一旦优化编译器进入画面,这可能根本不重要。

    正如您所指出的,NaN 标记的主要好处是它支持完整的双精度范围,这在某些情况下非常好。您可以基于任一技术构建性能良好的引擎。

    【讨论】:

    • 谢谢。关于第二点,当我说你有 52 位我的意思是说你可以在其中存储 SMI 时,我在我的问题中提到了它(略显含蓄)。但是,仍然需要位掩码
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多