Optimization V8元素类型优化

Optimization V8元素类型优化,optimization,v8,Optimization,V8,在阅读了本文之后,我想知道在内部优化方面,V8是否认为null和object是同一类型的 例如 [{},null,{}]vs[{},{},{}]是。元素类的唯一类型是“小整数”、“双精度”和“任意”null不是整数或双精度,所以它是“任何东西” 请注意,元素类型是按数组跟踪的,而不是按元素跟踪的。数组的元素种类是其任何元素所需的最通用的元素种类: [1, 2, 3] // "integer" elements (stored as integers internally) [1, 2,

在阅读了本文之后,我想知道在内部优化方面,V8是否认为
null
object
是同一类型的

例如

[{},null,{}]
vs
[{},{},{}]

是。元素类的唯一类型是“小整数”、“双精度”和“任意”
null
不是整数或双精度,所以它是“任何东西”

请注意,元素类型是按数组跟踪的,而不是按元素跟踪的。数组的元素种类是其任何元素所需的最通用的元素种类:

[1, 2, 3]     // "integer" elements (stored as integers internally)
[1, 2, 3.5]   // "double" elements (stored as doubles: [1.0, 2.0, 3.5])
[1, 2, {}]    // "anything" elements
[1, 2, null]  // "anything" elements
[1, 2, "3"]   // "anything" elements
原因是,首先跟踪元素种类的好处是可以避免某些检查。这(相对而言)对其他成本低廉的运营产生了重大影响。例如,如果要对数组的元素求和,这些元素都是整数:

for (let i = 0; i < array.length; i++) result += array[i];
for(设i=0;i
添加整数真的很快(一条指令+溢出检查),因此检查每个元素“这个元素是整数吗(所以我可以做整数加法)?”(另一条指令+条件跳转)会增加相对较大的开销,因此,预先知道这个数组中的每个元素都是整数可以让引擎跳过循环中的那些检查。然而,如果数组包含字符串,并且您希望将它们全部连接起来,那么字符串连接是一个慢得多的操作(您必须为结果分配一个新的字符串对象,然后决定是复制字符还是只引用输入字符串),因此额外的“this元素是字符串吗?”(所以我可以进行字符串连接)?“检查可能几乎无法测量。因此,将“字符串”作为一种元素进行跟踪不会带来太多好处,但会增加实现的复杂性,在某些情况下可能会降低性能成本,所以V8不会这样做。同样,如果您事先知道“此数组只包含
null
”,没有任何明显的信息可以让您利用这些知识加快速度


另外:作为一名JavaScript开发人员,不要担心元素的种类。请将这篇博文视为(希望是有趣的)关于V8如何从代码中挤出最后一点性能的故事;不要专门扭曲代码以更好地利用它(或花时间担心它)。差异通常很小,在重要的情况下,可能会发生这种情况。

谢谢!这条规则是否也适用于函数参数?(整型/双精度/任意)…以及函数返回值?不,函数参数和返回值不接受特殊的键入处理。(我看不出它们是如何做到的——从定义上讲,调用者可以传入他们想要的任何东西,被调用者可以返回他们想要的任何东西。数组可以跟踪“所有元素都是整数,哇,现在有一个字符串,更新存储的元素种类”,但对于函数来说,这是不等价的。)