我正在使用 transferables 在主线程和工作线程之间进行通信。我意识到通信会创建 GC 活动,因为在接收到缓冲区后,我使用 new 关键字将缓冲区转换为类型化数组:
var ary = new Float32Array(buffer);
有没有办法在不创建 GC 活动的情况下重用 TypedArray 或获取缓冲区视图?
我正在使用 transferables 在主线程和工作线程之间进行通信。我意识到通信会创建 GC 活动,因为在接收到缓冲区后,我使用 new 关键字将缓冲区转换为类型化数组:
var ary = new Float32Array(buffer);
有没有办法在不创建 GC 活动的情况下重用 TypedArray 或获取缓冲区视图?
我不认为有,没有。ArrayBuffer
几乎是一个没有类型化数组或DataView
查看它的黑盒子,您无法更改现有类型化数组或DataView
.
在支持它的平台上,您可以创建一个SharedArrayBuffer
主线程和工作线程都可以访问的,这不会有 GC 问题,因为每一方都会重用其包装器数组。只需确保您通过postMessage
或Atomics
(有关此问题的答案中的更多信息)访问它。
但可悲的是,大多数浏览器SharedArrayBuffer
都为响应 Spectre 而禁用,而我最后一次检查的只有 Chrome 重新启用了它(在启用其站点隔离功能的平台上)。