javascript - tablas - ¿Cómo optimizó Firefox este ciclo?
obtener datos de una tabla html javascript (3)
Firefox 9.0.1 me sorprendió al mostrar mi algoritmo de relleno de números Ω (log n) con un método de bucle Ω (n) cuando n es pequeño. En todos los otros navegadores que he visto, el ciclo es más lento , incluso para valores pequeños de n. Sé que todos los navegadores están trabajando en la optimización de JS, pero dado que todos los demás, los navegadores modernos muestran que el ciclo es más lento, ¿hay alguna explicación para el comportamiento en Firefox 9?
// Ω(log n)
function padNumberMath(number, length) {
var N = Math.pow(10, length);
return number < N ? ("" + (N + number)).slice(1) : "" + number
}
// Ω(n):
function padNumberLoop(number, length) {
var my_string = '''' + number;
while (my_string.length < length) {
my_string = ''0'' + my_string;
}
return my_string;
}
Actualización: no creo que esto esté relacionado con la pregunta original, pero acabo de descubrir que IE 9 cambia el comportamiento al cambiar de los modos de 32 a 64 bits. En el modo de 32 bits, el método Math gana. En el modo de 64 bits, el método Loop gana. Solo pensé que debería señalarlo.
Actualización 2: MAK me atrapó en su comentario a continuación. El método matemático no es Ω (1), es probablemente más como Ω (log n).
Firefox 9.0.1 me sorprendió al mostrar mi algoritmo de relleno de números Ω (1) con un método de bucle Ω (n) cuando n es pequeño.
¿No le faltan algunas partes a esa oración? ¿Estaba apareciendo como más rápido o algo así? ¿Y por qué estás concatenando String
vacías al Number
s? ¿Por qué no simplemente construir una String
?
Y sí, tu O (1) es realmente O (log) ...
De todas formas, la explicación probablemente se deba a Type Inference en Firefox 9
En cuanto a los resultados, es bastante claro que Firefox no hizo nada para lograr un aumento en el rendimiento.
Estas barras se pueden leer como "velocidades" (operaciones / seg.), Por lo que las barras más grandes son mejores . Todo es a escala.
En Firefox 9, es muy claro que el método "Matemáticas" funciona abismalmente, mientras que hay pocos cambios en el método "Loop" entre las versiones.
Así que no hubo "optimización" de ningún tipo en Firefox 9. Todo lo que sucedió entre Firefox 8 y 9 con respecto a estas pruebas es de alguna manera su biblioteca matemática más lenta ( Math.pow
es lenta), o su biblioteca de cadenas se hizo más lenta ( .slice()
siendo lento).
Si miramos más allá, está claro que estas operaciones elementales se volvieron un poco más lentas en ff9 :
Tanto la concatenación como Math.pow son un poco más lentas en FF 9 que en FF 8, lo que puede explicar la diferencia que ve en sus pruebas.
Curiosamente , la nueva barra no operativa es mucho más larga en FF8 que FF9.
Podría ser una matriz tan rápida como la copia de la cadena de parámetros en una nueva matriz de caracteres, que tal vez se haya inicializado por defecto a un carácter relevante, en este caso un número.
Quizás algo sobre el reconocimiento de la asignación recursiva que involucra una constante permite una concatenación rápida de una cadena de longitud-mystring.length + 1 ''0''s con mystring.
Alternativamente, podría ser algo tan simple como la exponenciación de Firefox cada vez más descuidada al no usar la expansión binaria del exponente para la cuadratura repetida.