En mi sistema (IE 8 en Windows 7) los tiempos de StringBuilder en esa prueba rondan entre un 70-100%, es decir, no es estable, aunque el promedio es aproximadamente el 95% del anexar normal.
Si bien es muy fácil ahora sólo para decir "optimización prematura" (y sospecho que en casi todos los casos lo es) hay cosas vale la pena considerar:
asignaciones de memoria
El problema con la concatenación de cadenas repetidas viene repetida y datos repetidos copias (avanzado de cadenas tipos de datos pueden reducir/eliminar gran parte de esto, pero vamos a mantener asumiendo un modelo simplista por ahora). De esto permite plantear algunas preguntas:
¿Qué asignación de memoria se utiliza? En el caso ingenuo, cada str + = x requiere str.length + x.length nueva memoria para ser asignada. El estándar C malloc, por ejemplo, es un asignador de memoria bastante pobre. Las implementaciones de JS han sufrido cambios a lo largo de los años, que incluyen, entre otras cosas, mejores subsistemas de memoria.Por supuesto, estos cambios no se detienen allí y tocan realmente todos los aspectos del código JS moderno. Debido a que ahora antiguas implementaciones pueden haber sido increíblemente lentas en ciertas tareas no implica necesariamente que los mismos problemas todavía existan, o en la misma medida.
Como en el ejemplo anterior, la implementación de Array.join es muy importante. Si NO asigna previamente la memoria para la cadena final antes de compilarla, solo ahorra en costos de copia de datos. ¿Cuántos GB/s es la memoria principal en estos días? 10,000 x 50 apenas está presionando un límite. Se esperaría que una operación inteligente Array.join con un POOR MEMORY ALLOCATOR funcione un poco mejor porque se reduce la cantidad de reasignaciones. Se espera que esta diferencia se minimice a medida que el costo de asignación disminuye.
El código de micro-punto de referencia puede ser defectuoso dependiendo de si el motor JS crea un nuevo objeto por cada literal de cadena ÚNICA o no. (Esto lo sesgaría hacia el método Array.join, pero debe tenerse en cuenta en general).
El punto de referencia es de hecho un micro punto de referencia :) Aumentar el tamaño de crecimiento debe tener un impacto de rendimiento basado en cualquiera o todas (y algunas) condiciones anteriores. En general, es fácil mostrar casos extremos que favorecen algún método u otro; el caso de uso esperado suele ser de mayor importancia.
Aunque, sinceramente, para cualquier forma de cuerdo edificio cuerda, me acaba de utilizar la concatenación de cadenas normales hasta el momento en que se determinó que era un cuello de botella, si alguna vez.
Volvería a leer el enunciado anterior del libro y ver si hay quizás otras consideraciones implícitas que el autor realmente quería invocar, como "para cadenas muy grandes" o "cantidades locas de operaciones de cadena" o "en JScript/IE6 ", etc ... Si no, entonces tal afirmación es tan útil como" Insertar ordenamiento es O (n * n) "[los costos realizados dependen del estado de los datos y el tamaño de n por supuesto] .
Y la exención de responsabilidad: la velocidad del código depende del navegador, el sistema operativo, el hardware subyacente, las fuerzas gravitacionales de la luna y, por supuesto, cómo se siente su computadora acerca de usted.
Acabo de probar su ejemplo en IE 7 (jsbin.com/ivako) y parece ser lo contrario de lo que dice. Obtengo: Concatenación con más: 92829 milisegundos Concatenación con StringBuffer: 125 milisegundos. En Firefox 3.5 en la misma máquina obtengo Concatenación con más: 110 milisegundos Concatenación con StringBuffer: 113 milisegundos –
Esto es peculiar. Pensé que estaba obteniendo resultados sesgados ya que estaba ejecutando el script localmente, así que me puse jsbin. Siempre lo mismo. Estoy usando IE8 y Firefox 3.5. Voy a probar esto en mi IE7 en la pc virtual. – Dhana
92829 milisegundos? Eso es 1 minuto 32 segundos. ¿Estás seguro? – bucabay