Web Workers - JSON的可转换对象

kcl*_*m06 30 javascript html5 json web-worker

在大型JSON对象上使用worker.postMessage时,HTML 5 Web worker非常慢.我正在尝试弄清楚如何将JSON对象传输给Web工作者 - 使用Chrome中的'Transferable Objects'类型,以提高速度.

这就是我所指的并且似乎应该加快这一点:http: //updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast

我很难找到一个很好的例子(我不相信我想使用ArrayBuffer).任何帮助,将不胜感激.

我想象的是这样的:

worker = new Worker('workers.js');

var large_json = {};
for(var i = 0; i < 20000; ++i){
   large_json[i] = i;
   large_json["test" + i] = "string";
};

//How to make this call to use Transfer Objects? Takes approx 2 seconds to serialize this for me currently.
worker.webkitPostMessage(large_json);
Run Code Online (Sandbox Code Playgroud)

kir*_*oid 0

虽然没有使用“可传输对象”,但这可能会解决您的问题。

您也可以尝试优化您的数据表示。例如,您的示例为我打包/解包需要约 1350 毫秒(Google Chrome 19),但以下代码的执行速度约快 25 倍(50 毫秒):

console.time('json');
var a = [], test = [];
for(var i = 0; i < 20000; ++i){
   a.push(i);
   test.push("string");
};
var large_json = {
  a: a.join(','),
  test: test.join(',')
};
large_json = JSON.parse(JSON.stringify(large_json));
large_json.a = large_json.a.split(",");
large_json.test = large_json.test.split(",");
console.timeEnd('json');
Run Code Online (Sandbox Code Playgroud)