2008-09-30 14 views
7

Tengo que concatenar un montón de cadenas en Javascript y estoy buscando la forma más rápida de hacerlo. Supongamos que el Javascript tiene que crear un gran "archivo" XML que, naturalmente, consiste en muchas cadenas pequeñas. Así que se me ocurrió:Javascript Concatenación de cadenas más rápido que este ejemplo?

var sbuffer = []; 
    for (var idx=0; idx<10000; idx=idx+1) { 
     sbuffer.push(‘<xmltag>Data comes here... bla... </xmltag>’); 
    } 
    // Now we "send" it to the browser... 
    alert(sbuffer.join(”)); 

No prestar ninguna atención al bucle o el otro código "sofisticada" que construye el ejemplo.

Mi pregunta es: ¿Para un número desconocido de cadenas, tiene un algoritmo/método/idea más rápido para concatenar muchas cadenas pequeñas a una enorme?

Respuesta

13

Cambio de la línea:

sbuffer.push(‘Data comes here... bla... ’);

a

sbuffer[sbuffer.length] = ‘Data comes here... bla... ’;

le dará ganancia de velocidad 5-50% (dependiendo del navegador, en el IE - ganancia será más alto)

Atentamente.

+1

¿Tiene alguna fuente de estadísticas sobre eso? Me hubiera imaginado que la penalización para verificar la longitud en cada iteración (ya sea en push, o array.length) resultaría igual. Sin duda, soy consciente de que la velocidad de concatenación de cadenas de IE deja mucho que desear. – scunliffe

1

Creo que está bastante cerca del óptimo. YMMV, se gana o se pierde una gran cantidad de velocidad dentro del motor de JavaScript del proceso de host (por ejemplo, el navegador).

+0

Sí, en realidad el "rendimiento" de Javascript tiene la gran ventaja de ejecutarse en muchas máquinas cliente y no solo en un servidor - divide et impere ;-). Pero con el cliente-scripting cada vez más complejo, el rendimiento es un problema allí también. Pregunta: ¿Qué significa YMMV? – Georgi

+0

Su millaje puede variar –

+0

@Georgi: Su millaje puede variar –

15

La pregunta JavaScript string concatenation tiene una respuesta aceptada que enlaza con un very good comparison of JavaScript string concatenation performance.

Editar: Hubiera pensado que podría obtener un poco más de rendimiento utilizando el dispositivo de Duff como lo sugiere el artículo.

+0

Hola Sam, Vi esa publicación antes, pero mi pregunta es un poco diferente en el comportamiento que realmente estoy preguntando si alguien tiene una solución más rápida y no solo intenta comparar la concatenación versus la unión. ¿Quién sabe? Tal vez haya otra solución que sea más rápida para cadenas enormes. – Georgi

+0

Enlace maravilloso, gracias! –

1

Creo que presionar las cuerdas en una matriz y unirlas a la matriz es la técnica más rápida para la concatenación de cadenas en JavaScript. Hay alguna evidencia de apoyo en este discussion about W3C DOM vs. innerHTML. Tenga en cuenta la diferencia entre los resultados innerHTML 1 e innerHTML 2.

1

Hasta donde yo sé, su algoritmo es bueno y se conoce como una solución de rendimiento para el problema de concatenación de cadenas.

0

¡Cuidado con IE bad basurero! ¿Qué supone hacer con su matriz después de usar? ¿Probablemente obtendrá GC?

Puede obtener ejecución al concatenar con combinaciones, y luego perder en post-GC'ing. Por otro lado, si deja una matriz en el alcance todo el tiempo, y NO la vuelve a utilizar, esa puede ser una buena solución.

Personalmente, me gustaría la solución más simple: solo para usar el operador + =.

+0

Me pregunto qué pasa con mi respuesta? – Thevs

0

Puede obtener un poco más de velocidad en buffering.

+0

Lo siento, esto no ayuda porque no se conoce el número de Cadenas a concatenar ("Para un número desconocido de Cadenas ..."). Pensé en el almacenamiento en búfer también, pero esto aumentará en gran medida la huella de memoria y la recolección de basura. – Georgi

Cuestiones relacionadas