news 2026/9/29 10:21:53

JavaScript 性能优化实测:8 个常见做法里,有 3 个反而更慢

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 性能优化实测:8 个常见做法里,有 3 个反而更慢

网上讲 JavaScript 性能优化的文章,绝大多数只给结论不给数据。我把 8 个最常见的优化手法在 Node 上真跑了一遍,结果有点反直觉:8 个里面有 3 个"经典优化"其实更慢。

先说真的快的三个

1. 按 id 查找:Map 代替 find —— 实测 680 倍

// 慢:每次都要遍历constuser=list.find(u=>u.id===targetId);// 快:一次建索引,之后 O(1)constmap=newMap(list.map(u=>[u.id,u]));constuser=map.get(targetId);

数据量越大差距越夸张。20 万条数据的场景下,这一条改动往往就能让页面从"卡"变成"不卡"。

2. 数组去重:Set 代替双重循环 —— 实测 90 倍

把out.indexOf(v)写在循环里就是 O(n²),而[...new Set(arr)]是 O(n)。

3. 记忆化递归 —— 实测 800 倍

斐波那契这类"重叠子问题",加一层缓存就是降维打击:

constmemo=newMap();constfib=(n)=>{if(n<2)returnn;if(memo.has(n))returnmemo.get(n);constv=fib(n-1)+fib(n-2);memo.set(n,v);returnv;};

反直觉:这三个"优化"其实更慢

4. 深拷贝:小对象上 structuredClone 比 JSON 慢 2.3 倍

很多人现在无脑推荐structuredClone。实测下来,对纯 JSON 数据它反而更慢——因为它要做完整的结构化克隆与类型检查。它的价值在于正确性(能克隆 Date、Map、Set、ArrayBuffer、循环引用),而不是速度。

结论:纯数据用JSON.parse(JSON.stringify());含特殊类型才用structuredClone。

5. 字符串拼接:现代 V8 下+=与join几乎没差别

实测 0.9 倍(join还略慢)。V8 早就对字符串拼接做了优化,"拼接要用数组 join"这条老经验已经不成立了。可读性优先。

6. 条件分支改写成查表:反而慢

只有当分支足够多、键取值范围可控时查表才有优势。分支很少时,多出来的对象查找开销比分支判断还贵。

为什么会"越优化越慢"

  1. 引擎已经优化过了:十年前的经验未必适用于今天的 V8;
  2. 前提条件不成立:很多优化只在特定数据规模下成立;
  3. 优化引入新开销:多一次建索引、多一次类型检查,小数据量下就是净亏损。

正确的工作流(比任何技巧都重要)

  • 先测量,再优化:没有 profile 的优化都是猜;
  • 先记基线:耗时、内存、包体积,改之前先写下来;
  • 一次只改一个变量:否则不知道是哪一步起了作用;
  • 算收益比:90 倍的改动值得做,0.9 倍的改动不值得。

怎么复现这些数字

只要装个 Node(18+),把基准脚本跑一遍就行:

functiontimeit(fn,times){constt0=process.hrtime.bigint();for(leti=0;i<times;i++)fn();returnNumber(process.hrtime.bigint()-t0)/1e6;}

注意两点:先预热再计时(避免首次 JIT 影响结论)、同样条件重复多轮。


我把这 8 项优化整理成了一套可直接运行的实战包:包含 before/after 基准脚本(能改成测你自己的代码)、Node 内置测试器写的单元测试示例、以及 ESLint / Vite / Webpack 的工程化配置模板与逐项说明。在 CSDN 下载里搜索「JavaScript性能优化实战」即可找到。

基准数字来自本机实跑,CPU 与 Node 版本不同会有差异,但趋势一致。


文中那 8 个基准测试的完整代码、工程化配置、优化清单 30 条,我打包好了(可直接跑):

https://download.csdn.net/download/2604_96203225/93505927

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 10:19:53

Altium Designer许可周转率优化实战指南

1. 项目概述&#xff1a;当Altium Designer许可成了研发流程的“交通瓶颈”在电子硬件研发团队里&#xff0c;Altium Designer不是一款普通软件&#xff0c;它是原理图绘制、PCB布局、信号完整性仿真、BOM生成乃至生产文件输出的“中枢神经系统”。但最近两年&#xff0c;我陆续…

作者头像 李华
网站建设 2026/9/29 10:18:40

Dify_SQLAgent 实战:用 MCP 打通金融数据库的 Agent 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 10:18:12

深度学习图像处理从入门到实战:选型、训练与部署全攻略

上周跟一个做工业质检的朋友吃饭&#xff0c;聊到他在产线上调参的事。背景纹理一复杂&#xff0c;传统的阈值分割就开始乱报&#xff0c;换了几轮参数都没彻底救回来。我说你干脆把缺陷区域分割的活儿交给深度学习&#xff0c;模型自己会去学“什么是缺陷”。他试跑了一版&…

作者头像 李华
网站建设 2026/9/29 10:15:11

轨道紧固件缺陷检测数据集 | 轨道紧固件 缺陷检测 铁路巡检 断裂识别9117期

轨道紧固件缺陷检测数据集 | 轨道紧固件 缺陷检测 铁路巡检 断裂识别9117期 数据集概述 本数据集专注于铁路轨道紧固件的缺陷视觉检测&#xff0c;服务于轨道巡检、设备状态评估及运维决策。数据涵盖六类紧固件状态与相关杂物&#xff0c;适配铁路巡检车、无人机及固定监控的自…

作者头像 李华
网站建设 2026/9/29 10:14:25

RL-08-赵-Value函数拟合算法02-ActionValue估算03:Deep Q-learning04【DQN优化技巧②:经验回放】【Β={(s,a,r,s′)},replay服从均匀分布】

2、技巧02:Experience replay(经验回放) 问题: 什么是Experience replay? 回答: 我们收集一些experience samples之后,we do NOT use these samples in the order they were collected。 Instead, 我们将它们存储在一个set中,称为 replay buffer B≐{ (s,a,r,s′)}\mat…

作者头像 李华