首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web Workers JSON的可转移对象

Web Workers JSON的可转移对象
EN

Stack Overflow用户
提问于 2012-07-07 00:09:35
回答 3查看 9.7K关注 0票数 30

HTML5Web worker在大型JSON对象上使用worker.postMessage时非常慢。我正在试图弄清楚如何将JSON对象传输给web worker --使用Chrome中的“可传输对象”类型,以提高速度。

这就是我所指的,看起来应该会把速度提高很多:http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast

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

我的想象是这样的:

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

发布于 2013-07-07 23:06:39

如果您必须从现有的Json数组从头开始构建,那么使用可转移对象将没有任何帮助(这非常接近于克隆...)

Json数据从何而来?将所有繁重工作保留在工作线程上的一种可能方法是让它使用XmlHttpRequest获取数据,转换数据并将其发送到UI线程。这样,克隆的高成本发生在工作线程上,虽然它将花费与在UI线程中相同的时间,但它不会阻塞您的应用程序。

票数 2
EN

Stack Overflow用户

发布于 2013-06-18 03:37:22

我这样做了,我不知道这样做是好是坏,是理想还是最糟糕的方式。我就这么做了。在worker文件中

代码语言:javascript
复制
var data = e.data;
var string = String.fromCharCode.apply(null, new Uint16Array(data));
var objnow = JSON.parse(string);

在html文件中

代码语言:javascript
复制
function str2ab(str) {
   var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
   var bufView = new Uint16Array(buf);
   for (var i=0, strLen=str.length; i<strLen; i++) {
     bufView[i] = str.charCodeAt(i);
   }
   return buf;
 }
function stop() {
 var obj = {'cmd': 'stop', 'msg': 'Bye'};
 var str= JSON.stringify(obj);
 var arbfr = str2ab(obj);
 worker.postMessage(arbfr,[arbfr]);
}

现在它可以工作了,我可以发送json对象,传输。

票数 1
EN

Stack Overflow用户

发布于 2012-08-01 15:10:11

虽然不使用“可转移对象”,但这可能会解决您的问题。

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

代码语言:javascript
复制
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');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11365894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档