我在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
. 这里发生了什么?
JavaScript 引擎能够更好地优化代码以提高性能,因为它确切地知道它正在接收什么对象,这使得更深层次的查找变得更快。
与 using 不同Object.create
,引擎无法执行其常规优化周期,使用普通的旧空对象来初始化对象的z
属性q
,基本上允许引擎分配适当的内存并相应地对其进行索引。
这段代码var q=Object.create(pro);
基本上告诉 JS 引擎:“嘿,你得到了一个 an 的实例,Object
但我不知道它是什么类型。可能是 Array、Objec、RegExp、Date。”,而这段代码——q.z={};
说——“嘿,你在Object
这里得到一个对象!确保根据这个数据类型留出一些内存”。