La eficiencia de JavaScript al realizar bucles en matrices de gran capacidad no es satisfactoria. Una vez hice una comparación en comparación con las matrices VBS, la velocidad del bucle de matrices de VBS es aproximadamente un orden de magnitud más rápida que la de JS ( http://community.csdn.net/Expert/TopicView. asp?id=4313487 ). No prestamos mucha atención a la eficiencia de las matrices JS en la programación general: ni siquiera se puede determinar la eficiencia de una matriz con solo unas pocas docenas de elementos, pero la cantidad de nodos es grande, como miles o decenas de miles. de nodos si se utiliza una gran cantidad de bucles de matriz, la cuestión de la eficiencia se convierte en la cuestión principal a considerar. La recuperación de matrices de gran capacidad generalmente tiene las siguientes aplicaciones: coincidencia rápida al seleccionar cuadros combinados, consultas de árbol, clasificación o recuperación de tablas, etc.
Déjame hacer una prueba. Primero, creo una matriz de gran capacidad:
<SCRIPT LANGUAGE="JavaScript">.
var n = 100000; //La capacidad máxima de la matriz
var a = nueva matriz();
para(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
</SCRIPT>
De esta manera, creé una matriz de caracteres con una longitud de 100000, luego recuperé la cadena que comenzaba con 0.9999 y la almacené en otra matriz.
<IDIOMA DE ESCRITURA="JavaScript">
var n = 100000; //La capacidad máxima de la matriz
var a = nueva matriz();
para(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
var comenzar = nueva Fecha().getTime();
var b = nueva matriz();
para(var i=0; i<n; i++)
{
si(a[i].indexOf("0.9999")==0)
{
b[b.longitud] = a[i];
}
}
document.write("Longitud de la matriz: "+ n);
document.write("<br>El método de bucle tradicional lleva tiempo" + (nueva Fecha().getTime() - comenzar)
+" milisegundos! Resultados de la recuperación: <strong title='"+ b.join(" ")
+"'>¡Registros "+ b.length +" recuperados!</strong>");
</SCRIPT>
Este paso de operación aquí toma alrededor de 2800 milisegundos. El ciclo aquí es muy simple. Solo hay un juicio if y una operación de asignación. Si el juicio aquí es un poco más complicado. Tomará más tiempo. Será un aumento de orden de magnitud. Entonces, ¿existen buenas soluciones de optimización para este problema? La respuesta es por supuesto que sí, de lo contrario todo lo que diría en este post sería un desperdicio de palabras. Pero ya no podemos utilizar nuestro pensamiento tradicional para optimizar este problema, porque no se puede encontrar una mejor forma de escribir en el pensamiento tradicional.
La solución es: primero unir() la matriz en una cadena grande y luego usar expresiones regulares para hacer coincidir y recuperar la cadena grande. Este método puede considerarse como mi originalidad personal. Se me ocurrió un truco torcido durante el proceso de escribir árboles, pero la eficiencia no es mala. Ya he analizado la eficiencia de join() ( http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx Velocidad de JavaScript: la eficiencia de combinar y empalmar cadenas). Este plan de optimización requiere un cierto nivel de habilidades en expresiones regulares.
<id de entrada="recuento" valor="50000" tamaño="7" maxlength="6">
<tipo de entrada="botón" valor="Array Hua inicial" onclick="txt.innerHTML = array_init()"><br>
<tipo de entrada="botón" valor="bucle tradicional" onclick="txt.innerHTML += método_for()">
<tipo de entrada="botón" valor="coincidencia regular" onclick="txt.innerHTML += método_regexp()">
<div id="txt"></div>
<IDIOMA DE ESCRITURA="JavaScript">
var txt = document.getElementById("txt");
var a = nueva matriz();
función array_init();
{
var n = parseInt(document.getElementById("count").value);
a.longitud = 0;
para(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
devolver "longitud de la matriz: "+ n;
}
función método_para()
{
var n = a.longitud;
var comenzar = nueva Fecha().getTime();
var b = nueva matriz();
para(var i=0; i<n; i++)
{
si(a[i].indexOf("0.9999")==0)
{
b[b.longitud] = a[i];
}
}
return ("<br>El método de bucle tradicional lleva tiempo" + (nueva Fecha().getTime() - comenzar)
+" milisegundos! Resultados de la recuperación: <strong title='"+ b.join(" ")
+"'>¡Registros "+ b.length +" recuperados!</strong>");
}
función método_regexp()
{
var comenzar = nueva Fecha().getTime();
var b = nueva matriz();
var s = a.join("x0f");
var r = new RegExp().compile("0\.9999\d+", "g");
b = s.partido(r); s = "";
return ("<br>El método de coincidencia regular lleva tiempo" + (nueva Fecha().getTime() - comenzar)
+" milisegundos! Resultados de la recuperación: <strong title='"+ b.join(" ")
+"'>¡Registros "+ b.length +" recuperados!</strong>");
}
</SCRIPT>
¡Puedes probarlo para ver cuál es la diferencia de eficiencia entre los dos métodos anteriores! El código está muerto, la gente está viva. Si cambia su forma de pensar o modelo, la eficiencia será muy diferente.
Me tomó mucho cerebro idear este truco y soy muy reacio a compartirlo. Ahora lo usaré para felicitar a todos por el comienzo del nuevo año 2006.