以下代码,那一部分运行快

上半部分代码块:

javascript复制代码

ini 复制代码
const arr1 = [];
for (let i = 0; i < 1000000; ++i) {
  arr1[i] = 1;
}

下半部分代码块:

javascript复制代码

ini 复制代码
const arr2 = [];
arr2[1000000 - 1] = 1;
for (let i = 0; i < 1000000; ++i) {
  arr2[i] = 1;
}

总结:

  • 上半部分代码效率更高,因为它利用了数组的快速模式。
  • 下半部分代码 由于先设置了 arr2[1000000 - 1],导致数组失去了快速模式的优势,降低了效率。

测试代码:

javascript复制代码

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

console.time('b');
const arr2 = [];
arr2[1000000 - 1] = 1;
for (let i = 0; i < 1000000; ++i) {
  arr2[i] = 1;
}
console.timeEnd('b');

JS运行机制:

浏览器 内核 JS解析引擎
Chrome 早期 WebKit,现目前 Blink V8
Mozilla Firefox Gecko SpiderMonkey
Edge Chromium Chakra / V8
Safari Webkit JavascriptCore

补充说明:

  • 比较主流的JS引擎是V8,这里假设是跑在Chrome或Node上,用的是V8引擎。
  • V8引擎利用隐藏类(Hidden Class)的方式来存放JS对象,并且数组有快速模式(Fast Mode)和字典模式(Dictionary Mode)。
  • 在快速模式下,数组的索引是连续的,并且类型是一致的,这样可以提高访问和赋值的效率。
  • 一旦数组的索引不连续(如 arr2[1000000 - 1] = 1),数组就会失去快速模式的优势,转而使用字典模式,效率降低。
  • 因此,左边代码生成的数组保持在快速模式,而右边代码生成的数组由于索引不连续而失去了快速模式的优势,导致左边代码性能更好。
  • 指导代码编写习惯:定义数组时,尽可能保持索引连续,避免使用非连续索引赋值。
相关推荐
Avan_菜菜8 小时前
AI 能写代码了,为什么我反而开始要求它先写文档?
前端·github·ai编程
爱勇宝12 小时前
鸿蒙生态的下半场:开发者不只要能开发,还要能赚钱
android·前端·程序员
IT_陈寒15 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen15 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
牧艺16 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
红尘散仙16 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
袋鼠云数栈UED团队17 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
袋鼠云数栈前端17 小时前
一套 Spec-First 的 AI 编程工作流
前端·ai+
angerdream17 小时前
Android手把手编写儿童手机远程监控App之vue3 路由守卫
前端
不服老的小黑哥17 小时前
AI规范驱动编程-harness工程项目实战
前端