La ejecución de WebWorkers parece ser mucho más lenta que el hilo principal

He estado trabajando en la optimización de algunos JAvaScript de larga ejecución e intenté implementar WebWorkers.

Tengo una colección de tareas independientes para calcular. En mi prueba inicial hay 80 tareas, y en el hilo principal se completa en 250 ms. Pensé que podría distribuir las tareas entre algunos trabajadores web y reducir el tiempo a unos 50 ms.

Mis datos son estructuras de datos de geometría que anidan múltiples matrices escritas. Tengo métodos que extraen todos los datos a JSON + una matriz de objetos ArrayBuffer, por lo que puedo pasar los datos transferidos al WebWorker sin duplicar las grandes matrices.

He probado la transferencia de datos y he confirmado que funciona como se esperaba. Mis matrices escritas están vacías en el hilo principal después de transferirlas al WebWorker.Lanzo (por ahora) 4 trabajadores web por adelantado, de modo que cuando sea necesario realizar el trabajo, los trabajadores deberían estar listos.Cuando cada trabajador termina una tarea, le doy la siguiente en la cola hasta que la cola esté vacía.Rastreo el tiempo en el trabajador web para ver cuánto se usa para realizar el cálculo real (por ejemplo, ignorando la sobrecarga de transferencia de datos).Tengo una computadora portátil de 8 núcleos que ejecuta código de subprocesos múltiples a diario.

Aquí está mi script de WebWorker.

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);
  }
}

Cuando el trabajador registra el tiempo que se usa, generalmente es de alrededor de 130 ms por trabajador, lo que significa que el tiempo total es en realidad casi 500 ms. El hilo principal hace todo el trabajo en 250 ms, así que voy 100% más lento usando WebWorkers. Por alguna razón, exactamente el mismo código que se ejecuta en un WebWorker es mucho más lento que en el hilo principal.

Algunas de las cargas de trabajo que tengo pronto podrían tener cientos de tareas, por lo que esperaba que WebWorkers mantuviera mi página receptiva. (Actualmente no es para nada en grandes cargas).

¿Alguien tiene alguna sugerencia de por qué estoy viendo resultados tan pobres? Nota: he eliminado el costo de la transferencia de datos (que creo que es mínimo) y el inicio de subprocesos aquí. Solo estoy midiendo el tiempo de cómputo en el trabajador, lo cual es pobre ... ¿Alguien tiene experiencia ejecutando tareas de cómputo pesadas en un trabajador web?

Una idea es que mi script de trabajo también carga mi script de motor principal. (MyLib.js en el código de ejemplo), que es un script empaquetado en la Web y bastante grande. Utilicé esto para que, con suerte, el almacenamiento en caché del navegador signifique que no es necesario volver a solicitarlo. Tal vez debería generar una versión mínima de mi motor solo para el contexto del trabajador web.

Gracias por cualquier consejo ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta