为什么 V8 使用指针标记而不是 NaN 装箱?

2024-03-17

我现在正在学习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(使用前将#替换为@)

为什么 V8 使用指针标记而不是 NaN 装箱? 的相关文章

  • 我应该如何优化这个文件系统 I/O 绑定程序?

    我有一个 python 程序 它执行如下操作 从 csv 文件中读取一行 对其进行一些变换 将其分解为实际的行 因为它们将被写入数据库 将这些行写入单独的 csv 文件 除非文件已完全读取 否则返回步骤 1 运行 SQL Loader 并将
  • 在 Ruby 中构建字符串时,为什么铲运算符 (<<) 优于加等于 (+=)?

    我正在通过 Ruby Koans 进行工作 The test the shovel operator modifies the original string公案中about strings rb包括以下评论 Ruby 程序员倾向于使用铲子
  • * 对于结构体来说是非法的吗?

    我尝试编译以下代码 但编译器不会执行此操作 因为 对于结构来说是非法的 这是真的吗 struct String int length int capacity unsigned check char ptr 0 String void ma
  • 指向数组的指针 int (*ptr)[]

    我想了解指向数组的指针如何工作 代码片段 include
  • 在 C 中打印指针

    我试图用指针来理解一些东西 所以我写了这段代码 include
  • 字符串数组初始化

    这是另一个的延续question https stackoverflow com questions 7834294 string array conversion I have 考虑以下代码 char hi hello char arra
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 如何分析Android应用程序的电池使用情况并对其进行优化?

    我想分析我的应用程序的电池使用情况 我的意思是应用程序的各个部分 例如 广播接收器 监听器 服务等 使用多少电池 我需要一个详细的列表 从列表中 我想优化电池的使用 方法与使用内存分析器类似 http android developers
  • 在C++中初始化静态指针

    我有一个带有静态成员的类 它是一个指针 如下所示 动画 h class Animation public Animation static QString m 动画 cpp include animation h QString Anima
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 什么是悲观主义?

    该问题有评论可以使用C 11的吗auto提高性能 https stackoverflow com questions 32510183 can the use of c11s auto improve performance这获得了很多选票
  • 使用 lpSolve 优化 R 团队名单

    我是 R 新手 有一个想要解决的特定幻想运动队优化问题 我见过其他帖子使用 lpSolve 来解决类似的问题 但我似乎无法理解代码 下面的示例数据表 每个球员都在一个球队中 扮演着特定的角色 有薪水 并且每场比赛都有平均得分 我需要的限制是
  • 将嵌套循环计算转换为 Numpy 以加速

    我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
  • static_cast 和对指针的引用

    谁能告诉我为什么这不能编译 struct A struct B public A int main B b A a b B b1 static cast
  • 规范“毒”方式真的值得吗? (3NF)

    我正处于数据库设计的早期阶段 所以还没有最终的结果 并且我正在为具有可选标签的线程使用 TOXI 3表设计 但我忍不住觉得加入是并不是真的必要 也许我只需要依赖我的简单标签列posts我可以在其中存储类似 varchar 的表
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 在这种情况下 b 是标量对象吗?

    include
  • 为什么 *(int*)0=0 不会导致访问冲突?

    出于教育目的 我正在编写一组导致 C 中运行时异常的方法 以了解所有异常是什么以及导致它们的原因 现在 我正在修改程序 导致AccessViolationException 对我来说 最明显的方法是写入受保护的内存位置 如下所示 Syste
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2

随机推荐