网络工作者数据传输的允许格式
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%),但数组缓冲区所有权已正确转移。
我一直在研究如何与 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%),但数组缓冲区所有权已正确转移。