WebWorkers Ausführung scheint viel langsamer zu sein als der Hauptthread

Ich habe an der Optimierung von JAvaScript gearbeitet und versucht, WebWorker zu implementieren.

Ich muss eine Sammlung unabhängiger Aufgaben berechnen. In meinem ersten Test gibt es 80 Aufgaben, und auf dem Hauptthread ist das in 250ms erledigt. Ich dachte, ich könnte die Aufgaben auf einige Web-Worker verteilen und die Zeit auf etwa 50 ms reduzieren.

Meine Daten sind Geometriedatenstrukturen, in denen mehrere typisierte Arrays verschachtelt sind. Ich habe Methoden, die alle Daten in JSON + extrahieren, ein Array von ArrayBuffer-Objekten, und so kann ich die Daten als an den WebWorker übertragen übergeben, ohne die großen Arrays zu duplizieren.

Ich habe die Datenübertragung getestet und bestätigt, dass sie wie erwartet funktioniert. Meine typisierten Arrays sind nach der Übertragung auf den WebWorker im Haupt-Thread leer.Ich starte (vorerst) 4 Web-Worker, damit die Worker bereit sind, wenn die Arbeit erledigt werden muss.enn jeder Arbeiter eine Aufgabe erledigt, gebe ich ihm die nächste in der Warteschlange, bis die Warteschlange leer isIch verfolge die Zeit im Web-Worker, um zu sehen, wie viel für die eigentliche Berechnung verwendet wird (z. B. Ignorieren des Overheads für die Datenübertragung).ch besitze einen 8-Kern-Laptop, auf dem täglich Multithread-Code ausgeführt wir

Hier ist mein WebWorker-Skript.

importScripts('../lib/MyLib.js');

let timeComputing = 0;  
this.onmessage = function(e) {
  switch (e.data.msg) {
    case 'compute':
        let mesh = ... unpack data;
        let start = performance.now();
        mesh.doexpensiveCompute();
        timeComputing += performance.now() - start;
        ... send data back to the main thread.
        break;
    case 'logTime':
        console.log("timeComputing:" + timeComputing);
  }
}

Wenn der Worker die verwendete Zeit protokolliert, sind es normalerweise ca. 130 ms pro Worker, was bedeutet, dass die Gesamtzeit tatsächlich fast 500 ms beträgt. Der Hauptthread erledigt die gesamte Arbeit in 250 ms, sodass ich mit WebWorkers 100% langsamer werde. Aus irgendeinem Grund ist genau derselbe Code, der in einem WebWorker ausgeführt wird, viel langsamer als im Haupt-Thread.

Einige der Workloads, die ich in Kürze habe, könnten Hunderte von Aufgaben haben, daher hoffte ich, dass WebWorkers meine Seite reaktionsfähig halten würden. (Derzeit ist es überhaupt nicht auf große Lasten).

Hat jemand Vorschläge, warum ich so schlechte Ergebnisse sehe? Hinweis: Ich habe die Kosten für die Datenübertragung (die meiner Meinung nach minimal sind) und den Thread-Start hier beseitigt. Ich messe nur die Rechenzeit im Worker, der arm ist ... Hat jemand Erfahrung damit, schwere Rechenaufgaben in einem Webworker auszuführen?

Eine Idee ist, dass ich mit meinem Worker-Skript auch mein Haupt-Engine-Skript lade. (MyLib.js im Beispielcode), ein Webpacked-Skript, und ziemlich groß. Ich habe dies verwendet, damit das Browser-Caching hoffentlich bedeutet, dass es nicht erneut angefordert werden muss. Vielleicht sollte ich stattdessen eine Minimalversion meiner Engine nur für den Webworker-Kontext generieren.

Vielen Dank für alle Tipps ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage