Foros del Web » Programando para Internet » Javascript »

[curiosidad] Creando cadenas de texto

Estas en el tema de [curiosidad] Creando cadenas de texto en el foro de Javascript en Foros del Web. Hola a todos! Hace tiempo me regalaron un libro de Nicholas C. Zakas llamado "Javascript para desarrolladores web". La verdad es que lo hojeé y ...
  #1 (permalink)  
Antiguo 08/06/2008, 12:08
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61
Sonrisa [curiosidad] Creando cadenas de texto

Hola a todos!

Hace tiempo me regalaron un libro de Nicholas C. Zakas llamado "Javascript para desarrolladores web". La verdad es que lo hojeé y me pareció que estaba muy bien pero no lo leí hasta hoy que he empezado a cotillearlo. Es muy divertido y didáctico y me ha enseñado una cosa curiosa que no sabía (una de muchas porque estoy aprendiendo bastante con este libraco). La cosa en cuestión es que es más rápido usar el método join para crear cadenas de texto que el típico texto+="pepito";

Es decir, que se tarda menos en que aparezca escrito "pablito clavó un clavito" así:
Código:
frase=new Array();
frase.push("pablito");
frase.push("clavó");
frase.push("un");
frase.push("clavito");

texto=frase.join(" ");
que así:
Código:
texto="pablito ";
texto+="clavó ";
texto+="un ";
texto+="clavito";
Esto lo pone como ejemplo para explicar los prototype (Dios, es interesantisiimo!!). Os pongo un ejemplo basándome en su texto (dejo todos los prototipos que he creado aunque alguno no se use):

Código:
<html>
<head>
<title>Untitled</title>
</head>

<body>
<script>

function anadirTexto(){
this._strings=new Array();
}

anadirTexto.prototype.poner= function(esto){
this._strings.push(esto);
}
anadirTexto.prototype.quitar= function(esto){
for(a=0;a<this._strings.length;a++){
if(this._strings[a]==esto){
this._strings.splice(a,1);
}
}
}

anadirTexto.prototype.crear=function(){
return this._strings.join(" ");
}

iteraciones=10000;
// COMIENZA LA PRUEBA

document.write("Iniciando por método join");
t1=new Date();

textito=new anadirTexto();
for(a=0;a<iteraciones;a++){
textito.poner("pepito");
}
texto=textito.crear();
t2=new Date();
document.write("<br />Terminado!<br /><br />");

textito=null;
texto=null;

document.write("Iniciando por método tradicional");
t3=new Date();
texto="";
for(a=0;a<iteraciones;a++){
texto+=" pepito";
}
t4=new Date();
document.write("<br />Terminado!");
alert("Usando join ha tardado:"+((t2-t1)/1000)+" segundos\n\nUsando método tradicional ha tardado: "+((t4-t3)/1000)+" segundos");

</script>


</body>
</html>
En el ejemplo crea una cadena con 10.000 pepitos seguidos. La diferencia de tiempo es más o menos del 50%. Pero si lo poneis para 50.000 la diferencia es abismal. Sobre todo en el IE7 (me ha tardado unos 150 segundos).

Según Nicholas, el motivo está en que con el método "tradicional" se crea una variable nueva por cada adición de texto que sustituye a la que había ya. El proceso sería algo así:

texto="hola";
texto+=" pepe";

1. crea una cadena para almacenar hola
2. otra para almacenar pepe
3. otra para almacenar el resultado de la suma
4. añade a esta última cadena el contenido de la varialbe texto (que es hola)
5. añade pepe al resultado
y 6. por último sustituye el valor de texto por el resultado de la suma.

No me digais que no es curioso.

EDITADO:

En firefox cuantas más iteraciones se ponga más gana el método tradicional!
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.

Última edición por KarlanKas; 08/06/2008 a las 12:14
  #2 (permalink)  
Antiguo 08/06/2008, 14:41
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Respuesta: [curiosidad] Creando cadenas de texto

Hola Carlos

qué interesante!

pero igual a FF le resulta al revés, tal y como mencionas tras editar el mensaje.

join 0.078
tradicional 0.031

osea, menos de la mitad del tiempo usando el método tradicional.

IE(6) al contrario

join 0.125
tradicional 0.406
  #3 (permalink)  
Antiguo 08/06/2008, 14:54
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61
Respuesta: [curiosidad] Creando cadenas de texto

¡¡Muy buenas, Helena!! ¡¡Cuanto tiempo sin coincidir!! Esto me recuerda a hace 5 años

Respecto al tema del hilo, supongo que cuanto más atrás se vaya en las versiones más tardará en hacerlo por la forma tradicional.

En safari 3.1 para Windows pasa lo mismo que con FF. Me temo que es un problema exclusivo de IE...

__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:08.