2016-09-13 2 views
3

Ich habe einen Web-Worker, der ständig große Mengen von Daten berechnet, die eine Runde ist ein Js-Objekt, die ich dann zu einem ArrayBuffer analysieren und dann senden es zum Hauptthread.Konvertieren von JS-Objekt in ArrayBuffer zu/von Web Worker gleich Engpass

Kann nicht viel über die Berechnung und die Übertragung des ArrayBuffer ist schnell. Das Parsen dieses Objekts verlangsamt jedoch den Prozess. Da das Objekt selbst Arrays aus mehr Objekten enthält.

In Firefox erhalte ich die folgende Warnung:

A script on this page may be busy, or it may have stopped responding. 
You can stop the script now, open the script in the debugger, 
or let the script continue. 

Script: http://localhost/js/util/DataViewSerializer.js:435 

Linie 435 bezieht sich auf eine Funktion, wo ich ein Array serialise. In dieser Zeile wird die for-Schleife deklariert.

DataViewSerializer.prototype.setArray = function (array, serializer) { 
    var i, 
     l = JSUtil.hasValue(array) ? array.length : 0; 

    this.setUint32(l); 

    console.log(array, serializer); 
    for (i = 0; i < l; i += 1) { 
     if (serializer !== undefined) { 
      serializer.serializeTo(array[i], this); 
     } else { 
      array[i].serializeTo(this); 
     } 
    } 
}; 

Ich bin über Transferable Object zwischen Web-Arbeiter und Haupt-Thread zu lesen. Das Senden von ArrayBuffers scheint der einzige Weg zu sein.

Also meine Frage ist, ob es schnellere Möglichkeiten gibt, ein js-Objekt und ArrayBuffer zu konvertieren? Oder irgendwelche anderen Vorschläge, um dies zu beschleunigen?

+1

Können Sie ein 'ArrayBuffer' anstelle eines' Array' ganzen und dann können Sie nur noch einmal konvertieren? – Xotic750

+0

Könnte ein letzter Ausweg sein, da ich viel Code umschreiben müsste. Und es wäre schwieriger zu debuggen oder zu verfolgen, denke ich. –

Antwort

-1

Ich bin es ernst genug. Dieses Thema wird wiederholt gestellt und in Web-Mitarbeitern upvoted.

Fragen dieses Charakters wurden bereits dreimal in Web-Arbeitern gestellt. Das sind zwei, die ich mit ziemlich langen Antworten beantwortet:

Da ich schon viel Text geschrieben habe, werde ich nur das Hauptthema wiederholen:

Verwenden Sie keine benutzerdefinierte Serialisierung zugunsten des Structured Clone-Algorithmus, es sei denn, Ihre Daten werden nicht vom Structured Clone-Algorithmus unterstützt!

Das heißt, rufen Sie einfach:

worker.postMessage({name: "MY_MESSAGE", data:myArray});