我在一个 jsperf 测试中发现了一些奇怪的行为。以下是设置:
var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;
然后,我只是查找每个属性q.x
,q._x
和q.z.x
。
单一查找q.x
比原型查找q._x
更快,这是预料中的。但是双重查找q.z.x
是最快的。我原本以为q.z.x
会是最慢的,特别是与q.x
相比。
q.z.x
甚至比q.z
还要快。这里发生了什么?
我在一个 jsperf 测试中发现了一些奇怪的行为。以下是设置:
var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;
然后,我只是查找每个属性q.x
,q._x
和q.z.x
。
单一查找q.x
比原型查找q._x
更快,这是预料中的。但是双重查找q.z.x
是最快的。我原本以为q.z.x
会是最慢的,特别是与q.x
相比。
q.z.x
甚至比q.z
还要快。这里发生了什么?
q.x=3
移到最后一行时,在 Firefox 37.0 中双重查找是最慢的。 - Leonidas Kapsokalivasq.<something>
之所以更快,是因为它有多个兄弟节点,而q.<something>.<something>
没有兄弟节点,因此在查找属性时,它需要迭代的项较少。但我错了,在将多个兄弟节点添加到对象根时,在Firefox中双重查找实际上具有相同的速度:http://jsperf.com/8dfns4/7 - Blaise