2

我正在尝试使用 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

感谢帮助!

4

1 回答 1

2

很多人在理解这一点上有问题。所以让我给你一个关于你的选择和他们做什么的形象:

postMessage(a)对您的数据使用纯文本

var object = { ... };
worker.postMessage(object);
  1. [主线程] 创建结构化克隆对象
  2. [主线程] 递归复制数据object到结构化克隆
  3. [主线程] 将对象发布到 [Worker]
  4. [Worker] 从结构化克隆创建新对象。
  5. [Worker] 以对象为参数发送新消息

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

(b) 将数据转换为可传输

var object = { ... };
var binary = CreateTypedArrayFromObject(object);
worker.postMessage(binary.buffer, [binary.buffer]);
  1. [主线程] 运行缓慢的 javascript 代码以转换objectTypedArray
  2. [主线程] 这涉及到先计算对象大小,或者创建许多类型化数组并将它们连接起来
  3. [主线程] 将ArrayBuffer的移动TypedArray到 [Worker]
  4. [工人] 接收ArrayBuffer
  5. [Worker] 以对象为参数发送新消息
  6. [Worker] 运行 javascript 代码创建新对象,丢弃接收到的数组缓冲区

我要指出的是,您想避免复制,但您仍在制作副本,只是这一次不是本机而是 javascript 副本。如果你想优化,你必须设计你的数据结构,以便它在类型化数组上运行。如果没有,就不要尝试使用它们——你只会给你的代码增加额外的开销。

于 2015-11-12T14:08:50.627 回答