Uygulama String Builder

Zeki Gürsoy

Uzman
Katılım
7 Haz 2018
Mesajlar
40
En iyi yanıt
0
Puanları
18
Konum
Sakarya-Hendek
"StringBuilder", Visual Studio' da bulunan bir sınıftır. Bu örnek, Excel simulasyonudur.

Normalde Visual Basic' de metin birleştirme operatorü "&" semboludur. İki metin veya sayı bu sembol ile birleşir. Birleştirilecek metin yüzbinlerce ise bu sembol performans kaybına neden olur. İşte bu durumda StringBuilder sınıfı çok yüksek bir hızda metin birleştirme işlemi yapar.

Ekli dosya ile bu performansları test ederek StringBuilder sınıfının performansını görebilirsiniz.

StringBuilder Sınıfı:
PHP:
'############################################
'#                                          #
'#         Zeki GÜRSOY © 2005-2018          #
'#                04.06.2018                #
'#                                          #
'# Yüksek performanslı StringBuilder Sınıfı #
'#                                          #
'############################################
        
#If VBA7 And Win64 Then
    Private Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
        ByRef Hedef As Any, _
        ByRef Kaynak As Any, _
        ByVal Uzunluk As Long)
#Else
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
        ByRef Hedef As Any, _
        ByRef Kaynak As Any, _
        ByVal Uzunluk As Long)
#End If

Private mainArray() As Byte, L As Long, SLen As Integer

Public Sub Append(ByVal value As String)

    If value = "" Then Exit Sub
    
    SLen = Len(value)
    
    L = L + SLen
    
    ReDim Preserve mainArray(L - 1)
    
    CopyMemory mainArray(L - SLen), ByVal value, SLen
    
End Sub

Public Sub AppendLine(Optional ByVal value As String = "")

    SLen = Len(value) + 2
    
    L = L + SLen
    
    ReDim Preserve mainArray(L - 1)
  
    CopyMemory mainArray(L - SLen), ByVal value & vbNewLine, SLen
    
End Sub

Public Sub Clear()

    Call Class_Terminate
    
End Sub

Public Sub CopyTo(sourceIndex As Long, destination() As Byte, destinationIndex As Long, Count As Integer)

    If ArrayIsInitialized(destination) = -1 Then ReDim destination(L - 1) As Byte
    
    CopyMemory destination(destinationIndex), mainArray(sourceIndex), Count
    
End Sub

Public Sub Insert(ByVal index As Long, ByVal value As String)

    If value = "" Then Exit Sub
    
    SLen = Len(value)
    L = L + SLen
    
    ReDim Preserve mainArray(L - 1)
    
    CopyMemory mainArray(index + SLen), mainArray(index), L - (index + SLen)
    
    CopyMemory mainArray(index), ByVal value, SLen
    
End Sub

Public Sub Remove(ByVal startIndex As Long, ByVal SLength As Long)
    
    SLen = L - 1
    
    L = L - SLength
    
    If startIndex = SLen Then
        ReDim Preserve mainArray(L)
        Exit Sub
    End If
    
    CopyMemory mainArray(startIndex), mainArray(startIndex + SLength), L - startIndex + 1
    
    ReDim Preserve mainArray(L - 1)
    
End Sub

Public Sub Replace(ByVal oldValue As String, ByVal newValue As String, Optional ByVal startIndex As Long = 0, Optional ByVal Count As Long = -1)
    Dim txt As String
    
    If Count = -1 Then Count = L - 1
    
    txt = String(Count, " ")
        
    CopyMemory ByVal txt, mainArray(startIndex), Count
      
    Remove startIndex, Count
      
    txt = VBA.Replace(txt, oldValue, newValue)
    
    Insert startIndex, txt
    
End Sub

Public Function ToString(Optional startIndex As Long = -1, Optional Length As Long = 0) As String

    ToString = String(L, " ")
    
    CopyMemory ByVal ToString, mainArray(0), L
    
End Function

Public Property Get Length() As Long

    Length = L
    
End Property

Private Function ArrayIsInitialized(arr() As Byte) As Integer
    On Error Resume Next
    
    Dim i As Integer
    
    i = UBound(arr)
    
    If Err.Number <> 0 Then
    
        ArrayIsInitialized = -1
        
        Exit Function
        
    End If
    
    ArrayIsInitialized = i
    
End Function

Private Sub Class_Initialize()

    L = 0
    
    SLen = 0
    
End Sub

Private Sub Class_Terminate()

    ReDim mainArray(0)
    
    Erase mainArray
    
    L = 0
    
End Sub
Test 1:
PHP:
Sub Test1()
    Dim s As String
    
    t1 = Timer
    
    For i = 1 To 500000
        s = s & "A"
    Next
    
    t2 = Timer
    
    MsgBox t2 - t1
End Sub
Test 2:
PHP:
Sub Test2()
    Dim sb As New StringBuilder
    
    t1 = Timer
    
    For i = 1 To 500000
        sb.Append "A"
    Next
    
    t2 = Timer
    
    MsgBox t2 - t1 '& " " & sb.ToString
End Sub
 

Ekli dosyalar

Murat OSMA

Yönetici
Site Yöneticisi
Katılım
25 May 2018
Mesajlar
1,239
En iyi yanıt
9
Puanları
113
Konum
İstanbul
Web sitesi
excelarsivi.com
Ad Soyad
Murat OSMA
Zeki Bey, paylaşımınız için teşekkürler. (y)

"&" Birleştirme Operatörüyle 57 saniye sürerken, StringBuilder Sınıfı ile 1,47 saniye gibi müthiş bir hız farkı gözlemledim. :eek:
Bu tarz yüksek sayıdaki metin birleştirme işlemlerinde mutlaka kullanacağım.
 
Üst Alt