[SRC] cConcatenator.cls

Iniciado por Psyke1, 11 Octubre 2011, 17:10 PM

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

Psyke1

Mi nueva clase para concatenar cadenas rápidamente (no incluye la opción de insertar/remover cadenas por ahora...):
Código (vb) [Seleccionar]

Option Explicit
Option Compare Binary
'====================================
' º Name      : cConcatenator.cls
' º Version   : 1.3
' º Author    : Psyke1
' º Twitter   : @SoyAbsurdo
' º Country   : Spain
' º Date      : 15/10/11
' º Visit     :
'    * http://foro.h-sec.org
'    * http://infrangelux.sytes.net
'====================================
Private Declare Sub RtlMoveMemory Lib "ntdll.dll" (ByVal lpDestination As Long, ByVal lpSource As Long, ByVal Length As Long)
Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByVal oleStr As Long, ByVal BLen As Long) As Long

Private sRet()                  As String
Private lCount                  As Long
Private lChunk                  As Long
Private lTotalLenB              As Long

Public Static Sub Append(ByRef sText As String)
Dim lLenB                       As Long
   
    lLenB = LenB(sText)
    If lLenB Then
        If lCount > lChunk Then
            lChunk = lChunk + lChunk + 1&
            ReDim Preserve sRet(lChunk) As String
        End If

        sRet(lCount) = sText
        lCount = lCount + 1&
        lTotalLenB = lTotalLenB + lLenB
    End If
End Sub

Public Static Property Get LengthString() As Long
    LengthString = LengthString \ 2&
End Property

Public Sub ResetAll()
    lCount = 0&
    lTotalLenB = 0&
End Sub

Public Static Property Get GetString() As String
Dim pDest                       As Long
Dim lLenBItem                   As Long
Dim Q                           As Long

    If lCount Then
        RtlMoveMemory VarPtr(GetString), VarPtr(SysAllocStringByteLen(0&, lTotalLenB)), 4&

        pDest = StrPtr(GetString)
        For Q = 0 To (lCount - 1&)
            lLenBItem = LenB(sRet(Q))
            RtlMoveMemory pDest, StrPtr(sRet(Q)), lLenBItem
            pDest = pDest + lLenBItem
        Next Q
    End If
End Property

Private Sub Class_Initialize()
    lChunk = &H270F&
    ReDim sRet(lChunk) As String
End Sub


Test comparándola con cStringBuilderl.cls (la más rápida que encontré en la red):



DoEvents! :P

$Edu$

Porque siempre se toman tanta molestia en agarrar mas velocidad? se que un buen programador tendria que hacer lo mas rapido posible sus codigos, pero porque? antes hace muchos años, las primeras computadoras, ahi si te entenderia, pero ahora con las pcs que hay, crees que se nota la diferencia? Hablo solamente de las funciones que mejoran ustedes aca siempre, porque en otras cosas si que hay que hacerlo lo mas veloz posible.

Psyke1

En ocasiones las cosas se pueden hacer mejor... Si una cosa es optimizable no es trabajo a la basura.
Supongamos que tienes que comprobar datos con una función 100.000 veces por ejemplo.

La función A tarda en cada uno : 0,010 seg y la función B: 0,015 seg

Tiempo tras la función A: 1000 seg
Tiempo tras la función B: 1500 seg

No sé tú, pero a mí si me importa esperar 500 segundos porque sí delante de la pantalla. :P

DoEvents! :P

$Edu$

Si puede ser, talvez porque no me ha tocado hacer bucles tan largos, pero algun dire: "Tenian razon" :P, saludos!

BlackZeroX

#4
la clase esta mal... tiene varias fugas de memoria...

* Antes de hacer un AllocString se debe hacer un sysfreestring si lpString es distinto a cero.
* Cuando se retorna la string concatenada se retorna una variable AUTOMATICA, lo cual si el puntero de la varible a retornar es la misma que lpString se realizarian 2 veces la destruccion de memoria... 1 por la clase y otra por la variable automatica y esto n deberia de ser...
** Suponiendo que se corrige el 1er punto, entonces al parecer se deberia de setear lpString igual a 0 como ultimo paso en AllocString.

A mi criterio NO es buena idea usar esas apis para esto debido a que vb6 no le da al programador tanta maniobrabilidad interna...

P.D.: Psyke1, ¿El proyecto ya se murio vdd?.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Psyke1

Ook, gracias, lo corregí.
Y no, no está acabado nuestro proyecto, ni mucho menos... :)

DoEvents! :P

Psyke1

Encontré otra forma de hacerlo que me gusta más y es más sintética aunque menos completa en algunos aspectos... :P

DoEvents! :P