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

上半部分代码块:

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),数组就会失去快速模式的优势,转而使用字典模式,效率降低。
  • 因此,左边代码生成的数组保持在快速模式,而右边代码生成的数组由于索引不连续而失去了快速模式的优势,导致左边代码性能更好。
  • 指导代码编写习惯:定义数组时,尽可能保持索引连续,避免使用非连续索引赋值。
相关推荐
mldong8 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排8 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60619 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角10 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!10 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰10 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi12 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen12 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马13 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒14 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端