workers usar regular importscripts expressions examples example como javascript regex firefox web-worker

javascript - usar - web workers examples



WebWorker calcula coincidencias de expresiones regulares lentas significativamente más lentas(3x)-solo firefox (1)

Después de una serie de pruebas, confirmó que este es un problema de Mozilla Firefox (afecta a todas las versiones de escritorio de Windows que probé). Con Google Chrome, Opera o incluso Firefox mobile, las coincidencias de expresiones regulares toman casi lo mismo, trabajador o no.

Si necesita solucionar este problema, asegúrese de votar el informe de error en bugzilla . Intentaré agregar información adicional si algo cambia.

Primero, creé una expresión regular que coincidirá con todas las rutas de biblioteca externas únicas en una lista de todos los archivos de encabezado en un proyecto. Hice una pregunta con respecto a hacer esa expresión regular hace una semana.

Comencé a entrometerme para ver cómo se comportaría cuando fuera asincrónico y cuando se convirtiera en un trabajador web. Por conveniencia y confiabilidad, creé este archivo universal que se ejecuta en los tres modos:

/** Will call result() callback with every match it founds. Asynchronous unless called * with interval = -1. * Javadoc style comment for Arnold Rimmer and other Java programmers: * * @param regex regular expression to match in string * @param string guess what * @param result callback function that accepts one parameter, string match * @param done callback on finish, has no parameters * @param interval delay (not actual interval) between finding matches. If -1, * function will be blocking * @property working false if loop isn''t running, otherwise contains timeout ID * for use with clearTimeout * @property done copy of done parameter * @throws heavy boulders **/ function processRegex(regex, string, result, done, interval) { var m; //Please tell me interpreter optimizes this interval = typeof interval!=''number''?1:interval; //And this processRegex.done = done; while ((m = regex.exec(string))) { Array.prototype.splice.call(m,0,1); var path = m.join(""); //It''s good to keep in mind that result() slows down the process result(path); if (interval>=0) { processRegex.working = setTimeout(processRegex, interval, regex, string, result, done, interval); // Comment these out for maximum speed processRegex.progress = regex.lastIndex/string.length; console.log("Progress: "+Math.round(processRegex.progress*100)+"%"); return; } } processRegex.working = false; processRegex.done = null; if (typeof done=="function") done(); } processRegex.working = false;

Creé un archivo de prueba, en lugar de pegarlo aquí, lo cargué en un alojamiento web muy confiable: Demo - Datos de prueba .

Lo que me parece sorprendente es que existe una diferencia tan significativa entre el trabajador web y la ejecución del navegador de RegExp. Los resultados que obtuve:

  • Mozilla Firefox
    • [WORKER]: Time elapsed:16.860s
    • [WORKER-SYNC]: Time elapsed:16.739s
    • [TIMEOUT]: Time elapsed:5.186s
    • [LOOP]: Time elapsed:5.028s

También puede ver que con mi expresión regular particular, la diferencia entre un bucle síncrono y asíncrono es insignificante. Traté de usar una lista de coincidencias en lugar de una expresión anticipada y los resultados cambiaron mucho. Aquí están los cambios a la función anterior:

function processRegexUnique(regex, string, result, done, interval) { var matchList = arguments[5]||[]; ... same as before ... while ((m = regex.exec(string))) { ... same as before ... if (matchList.indexOf(path)==-1) { result(path); matchList.push(path); } if (interval>=0) { processRegex.working = setTimeout(processRegex, interval, regex, string, result, done, interval, matchList); ... same as before ... } } ... same as before ... }

Y los resultados:

  • Mozilla Firefox
    • [WORKER]: Time elapsed:0.062s
    • [WORKER-SYNC]: Time elapsed:0.023s
    • [TIMEOUT]: Time elapsed:12.250s (nota para [TIMEOUT]: Time elapsed:12.250s mismo: se está [TIMEOUT]: Time elapsed:12.250s más raro cada minuto)
    • [LOOP]: Time elapsed:0.006s

¿Alguien puede explicar tal diferencia en la velocidad?