Zeki Gürsoy
Uzman
"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ı:
Test 1:
Test 2:
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