• Merhaba Ziyaretçi,
    Microsoft 365 Uygulamaları ile ilgili yeni haberler, dikkat çekici konular, ilgi ile takip edeceğiniz yazılar için.

    Abone Olun
  • ESTE - Microsoft Office Eğitimleri

    Yeni yıl Microsoft Office Eğitim planlarınız için bütçenizi oluşturmadan önce ESTE eğitim kalitesi ile tanışın. 🙌
    Kullanıcıların ihtiyacı olan yazılı materyal, dosya ve video kaynağı desteğimiz ile tüm ofis çalışanlarının iş süreçlerini rahatlatacak eğitimler planlayın. 🎯
    Microsoft Office eğitimlerimiz hakkında detaylı bilgi için bize ulaşın.

    👉 Microsoft Office Eğitim Talebi

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

  • StringBuilder.xlsm
    21.5 KB · Görüntüleme: 16

Murat OSMA

Yönetici
Site Yöneticisi
Katılım
25 May 2018
Mesajlar
1,508
En iyi yanıt
13
Puanları
113
Konum
İstanbul
Web sitesi
excelarsivi.com
Ad Soyad
Murat OSMA
Office Vers.
Office 365 TR+EN
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