以下代码运行,效率更高?

34 阅读1分钟

上半部分代码块:

javascript复制代码

const obj1 = {
  a: 1
}
const obj2 = {
  a: 1
}
const obj3 = {
  a: 1
}

下半部分代码块:

javascript复制代码

const obj1 = {
  a: 1
}
const obj2 = {
  b: 1
}
const obj3 = {
  c: 1
}

总结:

  • 上半部分代码效率更高,因为它重用了隐藏类(Hidden Class)。
  • 下半部分代码由于属性名不同,导致每个对象有不同的隐藏类,降低了效率。

测试代码:

javascript复制代码

// 测试代码
console.time('a');
for (let i = 0; i < 1000000; ++i) {
  const obj = {};
  obj['a'] = i;
}
console.timeEnd('a');

console.time('b');
for (let i = 0; i < 1000000; ++i) {
  const obj = {};
  obj[` ${i}` ] = i;
}
console.timeEnd('b');

JS运行机制:

浏览器内核JS解析引擎
Chrome早期 WebKit,现目前 BlinkV8
Mozilla FirefoxGeckoSpiderMonkey
EdgeChromiumChakra / V8
SafariWebkitJavascriptCore

补充说明:

  • 比较主流的JS引擎是V8,这里假设是跑在Chrome或Node上,用的是V8引擎。
  • V8是一个C++实现的JS解析引擎,内部利用隐藏类(Hidden Class)的方式来存放JS对象。
  • 隐藏类的特性是:多个属性顺序一致的JS对象,会重用同一个隐藏类,减少new Class的开销。
  • 所以左边生成1个隐藏类,而右边只生成3个隐藏类,因此左边代码性能更好。
  • 指导代码编写习惯:定义对象或类时,尽可能保证属性顺序一致。