Подтвердить что ты не робот

Веб-рабочие - переносимые объекты для JSON

HTML 5 Работники Web очень медленны при использовании employee.postMessage на большом объекте JSON. Я пытаюсь понять, как передать объект JSON веб-работнику - используя типы "Transferable Objects" в Chrome, чтобы увеличить скорость этого.

Вот что я имею в виду и кажется, что это должно ускорить это совсем немного: 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);
4b9b3361

Ответ 1

Использование переносимого объекта не поможет, если вам нужно собрать его с нуля из существующего массива Json (это очень близко к клонированию...)

Откуда берутся данные Json? Один из возможных способов сохранить всю тяжелую работу рабочего потока - это получить данные с помощью XmlHttpRequest, преобразовать их и отправить в поток пользовательского интерфейса. Таким образом, высокая стоимость клонирования происходит в рабочем потоке, и в то же время она будет выполняться в то же время, что и в потоке пользовательского интерфейса, она не будет блокировать ваше приложение.

Ответ 2

Не используя "Transferable Objects", но это может решить вашу проблему.

Вы также можете попытаться оптимизировать представление своих данных. Например. ваш пример занимает ~ 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');

Ответ 3

Хорошо, я сделал это, я не знаю, хорошо это или плохо, идеальный или худший способ сделать это. Я только что это сделал. в рабочем файле

var data = e.data;
var string = String.fromCharCode.apply(null, new Uint16Array(data));
var objnow = JSON.parse(string);

в html файле

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, передать.