我正在尝试使用Web Workers处理大量数据,并且在将数据传递回主线程进行显示时,我想使用可转移对象来减少对UI线程的影响。

该过程当前导致一个多维数组,该数组也可以包含对象。例如:

[{foo: [{bar: "Alice",
         car: 23,
         dab: [2, 3, 5]}],
  faa: [{moo: {a: [2,3], b: [4,5]} },
        {moo: {a: [6,7], b: [8,9]} }]},
 {foo: [{bar: "John",
         car: 33,
         dab: [6, 7, 1]}],
  faa: [{moo: {a: [5,5], b: [9,2]} },
        {moo: {a: [7,7], b: [4,2]} }]},
 ...]


我看过此字符串转换文章,但再次,我看不到如何直接将其应用于我的数组结构:
Converting between strings and ArrayBuffers

感谢帮助!

最佳答案

很多人在理解这一点上有困难。因此,让我给您一个有关您的选择及其作用的图片:

(a)对数据使用普通postMessage

var object = { ... };
worker.postMessage(object);



[主线程]创建structured clone对象
[主线程]将数据从object递归复制到结构化克隆
[主线程]将对象发布到[工作者]
[工作者]从结构化克隆中创建新对象。
[工作者]使用对象作为参数发送新消息


请注意,创建和解析结构化克隆是通过优化的本机代码完成的。

(b)将数据转换为可转让

var object = { ... };
var binary = CreateTypedArrayFromObject(object);
worker.postMessage(binary.buffer, [binary.buffer]);



[主线程]运行缓慢的javascript代码,将object转换为TypedArray
[主线程]涉及到首先计算对象大小,或者创建许多类型化数组并将它们连接在一起
[主线程]将ArrayBufferTypedArray移至[Worker]
[工作人员]收到ArrayBuffer
[工作者]使用对象作为参数发送新消息
[工作者]运行javascript代码创建新对象,丢弃接收到的数组缓冲区




我要指出的是,您想避免复制,但是您仍在复制,只是这次不是本机而是javascript。如果要优化,则必须设计数据结构,以使其在类型数组上运行。如果没有,甚至不要尝试使用它们-您只会在代码中添加额外的开销。

关于javascript - 将Javascript 2d数组转换为ArrayBuffer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23237611/

10-14 17:58
查看更多