如何解决为什么V8使用指针标记而不使用NaN装箱?
我正在学习V8内部知识。我了解到V8使用pointer tagging进行值存储,但是想知道为什么它不使用NaN拳击。
AFAIK,NaN拳击效果更好,因为它还可以存储双打,而不仅仅是SMI。我已经读过this,并且了解(如果是这样)为什么不在32位平台上使用NaN拳击。但是在64位平台上,我不明白为什么。
我怀疑原因与SMI有关。也许无法使用NaN拳击将其存储?我认为他们可以。我们有52个多余的位(我们甚至可以使用32个以上的位)。也许这将需要其他屏蔽操作,从而使整数数学运算变慢?但是我们已经需要进行按位移位!
我不知道为什么。感谢任何愿意回答的人。
解决方法
(这里是V8开发人员。)NaN装箱和指针标记是权衡不同的设计选择,两者都不比另一个更好。 V8使用指针标记的决定早在我加入该项目之前就已经做出,因此我只能推测当时的具体原因是什么。
指针标记的优点是:
- 显着减少内存消耗(某些情况下在32位平台上;在64位平台上也使用“ pointer compression”)
- 效率更高(较小)的整数运算,因为大多数CPU的整数运算都比其double运算快。一旦优化的编译器进入画面,这可能根本没有关系。
- 效率更高的指针操作,因为您可以在访问对象字段时添加经过调整的偏移量(其性能与根本不玩任何指针技巧相同),而不必掩盖NaN无关部分。一旦优化的编译器进入画面,这可能根本没有关系。
正如您所指出的,NaN标记的主要好处是它支持完整的double范围,在某些情况下非常好。您可以基于这两种技术构建性能良好的引擎。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。