javascript - 为什么在 javascript 中双重查找比单次查找更快?

标签 javascript jsperf

我在 jsperf 中看到一些奇怪的行为测试。这是设置:

var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;

然后我简单地查找每个属性 q.xq._xq.z.x

如预期的那样,单个查找 q.x 比原型(prototype)查找 q._x 更快。但是双重查找 q.z.x 是最快的。我预计 q.z.x 是最慢的,尤其是与 q.x 相比时。

q.z.xq.z 还要快。这是怎么回事?

最佳答案

让更深层次的查找更快的是 JavaScript 引擎能够更好地优化代码以提高性能,因为它确切地知道它正在接收什么对象。

与使用 Object.create 不同,引擎无法执行其常规优化周期,使用普通的旧空对象来初始化 z 属性>q 对象,基本上允许引擎分配适当的内存并相应地对其进行索引。

这段代码 var q=Object.create(pro); 基本上告诉 JS 引擎:“嘿,你正在获取 Object 的实例但是我不知道它是什么类型。可能是数组、对象、正则表达式、日期。”,而这段代码 -- q.z={}; 说 -- “嘿,你在这里得到一个 Object 对象!确保根据这个数据类型留出一些内存。

关于javascript - 为什么在 javascript 中双重查找比单次查找更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27221046/

相关文章:

javascript - 如何将 Angular1 应用程序改造成 VueJs 应用程序

javascript - 在不可编辑的字段中显示插入符号位置

javascript - 在 GWT 中使用 SVG

javascript - 如何从包含 $.get() 请求的函数返回 javascript 变量

javascript - 如何在jsperf中指定测试浏览器?

Javascript Function.prototype.call() 传递原始值

purescript - 在 jsPerf 中测试纯脚本函数

javascript - 为什么按数组迭代速度更快

javascript - 是否可以从 jsperf 中删除损坏的修订版?