无需登录 数据私有 本地保存

structuredClone 可转移对象演示 - 高性能深拷贝

15
0
0
0
structuredClone

structuredClone() 是浏览器内置的深拷贝 API,能够克隆大多数结构化数据,包括 ArrayBuffer、Date、Map、Set、RegExp、循环引用等 JSON.stringify 无法处理的数据类型。它基于 HTML 结构化克隆算法,比 JSON 深拷贝更强大、更可靠。在本工具中,structuredClone 是核心操作,分别以复制模式和转移模式执行,展示两种方式的行为差异。

Transfer(转移)

structuredClone(obj, { transfer: [buffer] }) 中的 transfer 选项允许将可转移对象(如 ArrayBuffer)的所有权从原对象转移到克隆对象,而不是复制。转移后,原 buffer 的 byteLength 变为 0(被 neutered),实现零内存复制,极大提升大块二进制数据的克隆性能。在本工具中,转移模式是核心演示内容,通过并排对比让用户直观理解其行为。

ArrayBuffer

ArrayBuffer 是 JavaScript 中用于表示固定长度二进制数据缓冲区的对象,是 Web 平台上处理二进制数据的核心类型。它是 Transfer 操作最常用的目标——在 Web Worker 通信、WebGL 纹理传输、音视频帧处理等场景中,ArrayBuffer 往往体积庞大,复制成本高昂。在本工具中,ArrayBuffer 是测试数据的核心组成部分,用户可以选择不同大小来观察 Transfer 的性能优势。

Neutered(去势)

当 ArrayBuffer 通过 Transfer 转移所有权后,原 buffer 会被「neutered」(去势),其 byteLength 变为 0,任何尝试读写该 buffer 的操作都会静默失败或返回 0。这是设计行为,确保同一时刻只有一份内存 ownership,避免数据竞争。在本工具中,转移后原始对象的 buffer 状态显示为红色失效,直观展示 neutered 的效果。

深拷贝(Deep Clone)

深拷贝是指递归复制对象的所有层级,创建一个与原对象完全独立的新对象。修改新对象不会影响原对象,反之亦然。structuredClone 提供了比 JSON.parse(JSON.stringify()) 更强大和可靠的深拷贝能力,支持更多数据类型。在本工具中,复制模式展示了标准的深拷贝行为——原对象和克隆对象各自持有独立的 ArrayBuffer 副本。

Transferable Objects(可转移对象)

可转移对象是实现了 Transferable 接口的对象,包括 ArrayBuffer、MessagePort、ImageBitmap、OffscreenCanvas、ReadableStream、WritableStream、TransformStream、VideoFrame、AudioData 等。这些对象支持 Transfer 操作——所有权可以在不同执行上下文之间转移,而无需复制底层数据。在本工具中,ArrayBuffer 是最常用的可转移对象类型。

复制模式

structuredClone(obj) 不带 transfer 选项时,执行标准的深拷贝——递归复制所有属性,包括 ArrayBuffer 的完整内容。原对象和克隆对象各自持有独立的 buffer 副本,互不影响。复制模式的优点是原对象保持完整可用,缺点是需要额外的内存和复制时间。在本工具的左侧面板展示复制模式的执行结果。

零拷贝(Zero-Copy)

零拷贝是一种不实际复制数据就能在不同组件之间共享数据的技术。Transfer 机制通过转移 ArrayBuffer 的所有权实现零拷贝——只修改内存引用,不复制实际数据。这在处理大块二进制数据时性能优势显著。在本工具中,转移模式下克隆操作的耗时接近零,正是零拷贝的体现。