while tiempo salir optimizar for ejemplos ejecución bucle javascript regex performance performance-testing indexof

tiempo - salir de un for javascript



Rendimiento de Javascript: ¿por qué hacer un bucle a través de una matriz y comprobar que cada valor es más rápido que indexOf, buscar y emparejar? (2)

He añadido dos pruebas más: http://jsperf.com/finding-components-of-a-url/2

El único regExp es más rápido ahora (en Chrome). También los literales regExp son más rápidos que los literales de cadena convertidos a RegExp.

Esto fue una gran sorpresa para mí, y me gustaría entender este resultado. Hice una prueba en jsperf que básicamente se supone que toma una cadena (que es parte de una URL que me gustaría revisar) y verifica la presencia de 4 elementos (que de hecho, están presentes en la cadena).

Se verifica de 5 maneras:

  1. indexOf simple;
  2. Dividir la cadena, a continuación, indexOf;
  3. búsqueda de expresiones regulares;
  4. coincidencia regex
  5. Divide la cadena, recorre la matriz de elementos y luego comprueba si alguno de ellos coincide con lo que se supone que debe coincidir

Para mi gran sorpresa, el número 5 es el más rápido en Chrome 21 . Esto es lo que no puedo explicar.

En Firefox 14, el índice simple es el más rápido, que puedo creer.


También estoy sorprendido, pero Chrome usa v8, un motor de JavaScript altamente optimizado que atrae todo tipo de trucos. Y los chicos de Google probablemente tengan el mayor conjunto de JavaScript para ejecutar y probar el rendimiento de su implementación. Así que mi conjetura es que esto sucede:

  1. El compilador se da cuenta de que la matriz es una matriz de cadenas (el tipo puede determinarse en el momento de la compilación, no se requieren comprobaciones de tiempo de ejecución).
  2. En el bucle, ya que usa === , se pueden usar los códigos de repe cmpsb CPU incorporados para comparar cadenas ( repe cmpsb ). Por lo tanto, no se llama a ninguna función (a diferencia de cualquier otro caso de prueba)
  3. Después del primer bucle, todo lo importante (la matriz, las cadenas con las que comparar) está en los cachés de la CPU. La localidad los gobernó a todos.

Todos los otros enfoques deben invocar funciones y la localidad podría ser un problema para las versiones regexp porque crean un árbol de análisis.