Node.js 的核心仓库今年 1 到 6 月,每个月都落了一批性能改动,多数人升级之后只觉得快了点,说不清快在哪。
把这些改动按月整理成帖的人是 Gürgün Dayıoğlu,Node.js 核心协作者,也是 Fastify 的维护者,他从十月起每月写一篇。

一月动的是文本编码和 CommonJS 导入。
TextEncoder.encode() 是浏览器和 Node 通用的字符串转字节接口,底层换成 simdutf,一个用 SIMD 指令批量处理 UTF-8 的库,比逐字符转换快得多。
js
const bytes = new TextEncoder().encode("你好,Node.js");
const text = new TextDecoder().decode(bytes);
CJS 那边的分析器换成了一个叫 merve 的实现。
require() 的写法没变,变的是第一次读文件扫导出名那一步,CLI 工具和测试启动这类一次性进程体感最明显,冷导入快了约 25%。
二月是启动和缓冲写入。
Node 的 ESM 加载器以前每次启动都要从头搭一遍,现在直接打进启动快照,ESM 启动快了 6.06%。
js
import { readFile } from "node:fs/promises";
const text = await readFile("./data.txt", "utf8");
buf.write() 也换成 simdutf,2048 字符的写入快了 577%,序列化、数据库驱动这类把文本塞进 Buffer 的代码收益最大。
js
const buf = Buffer.alloc(2048);
buf.write("一段不短的文本", "utf8");
同月 util.styleText() 在不需要校验流时走了快路径。
三月是 Buffer。
Buffer.copyBytesFrom() 带偏移量的调用快了 210%,同批还改了别的 Buffer 操作。
js
const src = Buffer.from("abcdef");
const dst = Buffer.alloc(3);
Buffer.copyBytesFrom(dst, src, 1);
console.log(dst.toString()); // bcd
加密这边是 EC 公钥导入。
JWT 验签常要把公钥从 JWK 导进来,JWK 就是这种公钥的 JSON 写法,导入速度从每秒 76259 次提到 168920 次。
js
import { createPublicKey } from "node:crypto";
const key = createPublicKey({ key: jwk, format: "jwk" });
EventEmitter 发射时不再克隆监听器数组,Web Streams 的 pipeTo() 也轻了一些,这批随 24.15.0 与 26 发布。
四月最零碎,都落在常用接口上。
URLSearchParams 遇到重复键时,set() 和 delete() 以前要反复扫全表,delete() 在极端场景快了 1852%,日常没这么夸张,但多余的扫描确实没了。
js
const params = new URLSearchParams("a=1&a=2&a=3");
params.delete("a");
Buffer.toString("hex") 在 64 字节的小 Buffer 上快了 41.64%,哈希、ID、token 打日志都走这条路。
js
const id = Buffer.from("hi").toString("hex"); // 6869
内置的 node:sqlite 读文本列快了 29.51%,纯 ASCII 文本占的内存也少了。
实验性的 node:ffi 给传数字和指针的调用加了快路径,指针调用快 60%。
process.nextTick() 在没有待处理 promise 时跳过拒绝检查,每秒从 692 万次到 904 万次。
四月这批随 26.1.0 与 24.16.0 发布。
五月偏 Web 平台。
util.styleText() 用十六进制颜色时以前每次新建格式化器,现在加了缓存,快了 1135%。
js
import { styleText } from "node:util";
console.log(styleText("red", "构建失败"));
crypto.subtle 每次调用都要先判断用哪个算法,这一步快了 164.69%。
QUIC 是 HTTP/3 底下那个传输协议,Node 的支持还在实验阶段,一批包处理改动让它每秒请求数高了约 10%。
五月随 26.3.0 与 24.19.0 发布。
这六个月的东西分散在几层,横着看就是下面这张图的形状。

六月几乎全是文本。
TextEncoder.encode() 以前先把字符串复制一份再编码,现在省掉这步,8 KB 字符串快了 43.9%。
js
const big = "a".repeat(8192);
const bytes = new TextEncoder().encode(big);
buf.copy() 复制 Buffer 切片快了 22.33%,pipeTo() 每个 chunk 少做一点事,吞吐高了约 5%。
事件循环在没有排队任务时跳过内部回调检查,从每秒 77957 次到 81438 次,每个 Node 进程都吃到。
六月随 26.5.0 发布。
帖子里写明了版本的月份,就是下面这几条。

升级不用改代码,24.x 与 26.x 的小版本里都有了。
想知道自己的版本吃到哪批,去 changelog 搜 perf。
Node.js 全部版本:https://nodejs.org/en/about/previous-releases。
你平时会为了启动时间升级运行时吗,欢迎在评论区说说。
关于我:
- 农村程序员(
2020年回农村,至今未出村) - 独立开发者(
致力于开发 1000 个小产品) - 技术观察者(
分享编程技术,行业资讯等) - 前端之虎陈随易(
自封的) - 我的官网是:
https://yicode.tech