网络工作者数据传输的允许格式

Allowable format for webworker data transfer

我一直在研究如何与 webworkers 之间传输数据,我发现的每个示例都显示了以下格式:

var myData = new Uint8ClampedArray(256);
postMessage(myData.buffer, [ myData.buffer ]);

但是我希望能够发送额外的数据。所以,我的问题是以下是否也转移了 myData 缓冲区的所有权,还是只是复制?

var myData = new Uint8ClampedArray(256);
postMessage({ foo: 'bar', data: myData }, [ myData.buffer ]);

几个月后我才回到这个问题,并决定 运行 一个基准。不幸的是,我不知道如何在 jsperf 上正确地执行它,所以我继续将 this gist 放在一起。使用 1 MB Uint8ClampedArray 超过 10000 次往返循环,我的结果如下:

worker.postMessage(data, [ data.buffer ]);
// => 1112ms

worker.postMessage({ foo: 'bar', data: data }, [ data.buffer ]);
// => 1220ms

worker.postMessage(data);
// => 11862ms

worker.postMessage({ foo: 'bar', data: data });
// => 12244ms

结果基本符合我的预期,但很高兴得到确认。在对象中添加额外数据似乎确实有一些开销 (~10%),但数组缓冲区所有权已正确转移。