Autor Tema: Concatenar Strings Super Rapido (StringBuilder)  (Leído 13906 veces)

0 Usuarios y 1 Visitante están viendo este tema.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Concatenar Strings Super Rapido (StringBuilder)
« en: Septiembre 17, 2011, 04:02:23 pm »
Hola, este post es simplemente para mostrarles algo que seguro muchos ya saben, pero para los que no pues aca lo tienen.

El tema de la concatenacion de Strings saben que al concatenar los strings en un bucle haciendo algo como:

Código: [Seleccionar]
    For i = 0 To 100000
        vSQL = vSQL & "a"
    Next i

la performance en bucles largos se pierde ya que este metodo crea una nueva string en cada iteracion y el tiempo que tarda en terminar es mucho.

esto como sabran en .NET se soluciona usando la clase StringBuilder() que es rapidisima.

y bueno si estan buscando algo como el StringBuilder() de .NET en visual basic 6, tenemos la clase cStringBuilder de vbAccelerator

Link descarga cStringBuilder: StringBuilder Class for VB

tiene los mismo metodos clasicos de .NET, como Append() para agregar el string, .Clear y ToString para mostrar el string final, mas algunos metodos mas. usa la api CopyMemory para realizar el trabajo.

y el resultado es abismalmente mejor que la con la concatenacion con &.

aca un ejemplo simple usando un bucle de 100 mil iteraciones. y con la clase cTiming se toma el tiempo.

Código: [Seleccionar]
Dim oSQL As cStringBuilder
Dim oTiming As CTiming
Dim i As Long
Dim vSQL As String

Private Sub Command1_Click()
    oTiming.Reset
   
    For i = 0 To 100000
        oSQL.Append "a"
    Next i
   
    Text1.Text = Text1.Text & oTiming.Elapsed & vbNewLine
    oSQL.Clear
End Sub

Private Sub Command2_Click()
    oTiming.Reset
   
    For i = 0 To 100000
        vSQL = vSQL & "a"
    Next i
   
    Text1.Text = Text1.Text & oTiming.Elapsed & vbNewLine
    vSQL = ""
End Sub

Private Sub Form_Load()
    Set oSQL = New cStringBuilder
    Set oTiming = New CTiming
End Sub

el resultado compilado es el siguiente:

String: entre 4.4 y 4.5 segundos

StringBuilder: 0.054 segundos y a veces 0.020

o sea entre 20 y 50 milisegundos, mientras que el otro 4500 milisegundos, lo que seria entre 90 y 100 veces mas rapido, y mientras mas grande se haga el bucle mas rapido sera y el string casi no termina mas.

saludos.
« última modificación: Octubre 30, 2014, 11:22:25 pm por seba123neo »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #1 en: Septiembre 18, 2011, 09:25:06 pm »
No he podido hacerlo arrancar.
Supongo que la clase es el codigo ubicado aqui , pero creo que algo me falta porque se me cae en
Dim oSQL As cStringBuilder y de hecho se cae en las siguientes lineas. El mensaje de error es:

"No se ha definido el tipo definido por el usuario"

Trate de definirlo pero no la chunto.  :-[
Me encuentras en YAcosta.com

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #2 en: Septiembre 18, 2011, 09:50:19 pm »
LE pusiste el nombre "cStringBuilder" a la clase ?

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #3 en: Septiembre 18, 2011, 11:13:30 pm »
No le habia puesto, sorry  :-[

Ya se lo puse, lo arranco ahora me salta en la siguiente linea:
Dim oTiming As CTiming

Y me sale el mismo error.  Sorry no logro cazar esa parte... también.
« última modificación: Septiembre 18, 2011, 11:15:36 pm por YAcosta »
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #4 en: Septiembre 19, 2011, 06:37:42 am »
Hola Yvan, la calse  CTiming es solo para testear la velocidad pero no es necesaria, la verdad esta piola la clase cStringBuilder, de todas formas si se sabe el tamaño de lo que se quiere construir o es la misma cadena que se repite es mas rapido utilizando la función Mid$ del vb, la clase cStringBuilder es apropiada para construcciones sql, html y cosas asi.

Saludos.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #5 en: Septiembre 19, 2011, 09:51:21 am »
la clase cTiming se baja de aca:

cTiming

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #6 en: Septiembre 19, 2011, 12:15:16 pm »
Muchas gracias!!! Ahora si lo testee.

Gracias Lea por ubicarme.
Me encuentras en YAcosta.com

Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #7 en: Octubre 06, 2011, 05:22:15 pm »
Muy interesante la verdad, pero creo que quedaría mejor si se pusieran más test para ver como se comporta añadiendo cadenas largas.

DoEvents! :P

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #8 en: Octubre 07, 2011, 09:38:54 am »
El rendimiento es superior al de concatenar de manera "nativa" sin importar el tamaño de las cadenas simplemente por la mecanica que utiliza.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #9 en: Octubre 09, 2011, 01:29:44 am »
el rendimiento es impresionante, prueben hacer esto....agregar cadenas largas, por ejemplo yo lo uso para hacer INSERTS en mysql de la forma que se llama "BATCH INSERT" (algo parecido al bulk insert de sql server) que son los inserts seguidos de los valores separados por comas.

por ejemplo un insert comun:

Código: [Seleccionar]
INSERT INTO Tabla (campo1,campo2) VALUES ('1', 'prueba')
si necesito insertar miles de registros, debo hacer miles de inserts, pero con batch es asi.

Código: [Seleccionar]
INSERT INTO Tabla (campo1,campo2) VALUES ('1', 'prueba'), ('2', 'prueba'),('3', 'prueba'),('4', 'prueba'),('5', 'prueba')
entonces esa concatenación dinamica si lo hacen con & , es super lenta, si el sistema tiene una tabla con 40 o mas campos, imaginense el string que se va generando, el & llega a un punto en el que va cada ves mas lento y llega a tardar MINUTOS, en cambio con este metodo no tarda ni un segundo, UNA BESTIA.

saludos.

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #10 en: Octubre 09, 2011, 04:20:26 pm »
Lo acabo de usar para un migrador de Access a MySQL que pase 1millon (aprox) de registros de 50 en 50... y la verdad que vuela :3

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #11 en: Octubre 09, 2011, 08:17:43 pm »
si yo tambien lo hago cada tantos registros, en mi caso mil, porque si son cientos de miles (por ejemplo 300 mil), hacer un insert de 300 mil a la vez puede ser mas lento que ir insertando de a pequeñas cantidades, yo de a mil no tengo problema, una importacion que antes tardaba mas de un minuto, ahora con este metodo tarda 10 segundos.
« última modificación: Octubre 09, 2011, 08:27:56 pm por seba123neo »

javierjava

  • Kilobyte
  • **
  • Mensajes: 69
  • Reputación: +6/-0
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #12 en: Octubre 10, 2011, 01:15:14 pm »
Esta muy interesante pero estoy perdido en como usarlo  :-[ alguien podría poner un ejemplo ya con una base de datos y que se pueda hacer insert ?  ;D


Psyke1

  • Megabyte
  • ***
  • Mensajes: 130
  • Reputación: +11/-7
  • VBManiac
    • Ver Perfil
    • h-Sec
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #13 en: Octubre 11, 2011, 12:22:47 pm »
Echad un vistazo a esto a ver que os parece: http://leandroascierto.com/foro/index.php?topic=1286.0

DoEvents! :P

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Concatenar Strings Super Rapido (StringBuilder)
« Respuesta #14 en: Octubre 11, 2011, 09:47:23 pm »
no avise antes, pero habia encontrado una clase mucho mas veloz, la de vbacelerator es lenta. haber si pongo un ejemplo para que vean.

saludos.