Если нужно много добавлять в текстовою переменную
| Код | Dim A As String, N As Integer For N = 1 To 1000 A = A & "Text" 'Частое добавление к строке Next N |
Тогда используйте класс "ClassSAdd"
| Код | Option Explicit Private nTextPos As Long Private nLenText As Long Private mvarsText As String
Public Property Let sText(ByVal vData As String) If vData = "" Then Clear Exit Sub End If mvarsText = vData & String$(1024, " ") nTextPos = Len(vData) nLenText = Len(mvarsText) End Property
Public Property Get sText() As String sText = RTrim(mvarsText) End Property
Public Sub Add(sText As String) Dim nLocalLen_sText As Long nLocalLen_sText = Len(sText) If nLocalLen_sText = 0 Then Exit Sub If (nTextPos + nLocalLen_sText) > nLenText Then mvarsText = mvarsText & String$(1024 + nLocalLen_sText, " ") nLenText = Len(mvarsText) End If Mid$(mvarsText, nTextPos, nLocalLen_sText) = sText nTextPos = nTextPos + nLocalLen_sText End Sub
Public Sub Clear() mvarsText = String$(1024, " ") nTextPos = 1 nLenText = 1024 End Sub
Private Sub Class_Initialize() Clear End Sub |
И так будет намного быстрее
| Код | Dim B As New ClassSAdd, N As Integer For N = 1 To 1000 B.Add "Text" Next N |
Akina:
| Цитата(Vach @ 25.8.2005, 16:45) | | Если нужно много добавлять в текстовою переменную |
| Код | Function MakeLongString(ByVal Fragment As String, ByVal Count As Integer) As String Dim i As Integer Dim Length As Integer i=1 Length=Len(Fragment) While i<Count i=i+i Fragment=Fragment & Fragment Wend MakeLongString=Left(Fragment,Length*Count) End Function
|
Так будет еще быстрее...
Vach: Akina я криво пример описал. Мой пример предназначен для плюсования разных переменных. Тоесть "Text" меняется. Ускорение происходит именно из замены "Fragment=Fragment & Fragment" на вклеивание в пустой буфер. При увеличении длины "Fragment" новое добавление происходит всё медленнее.
Akina: Тогда:- Dim-нуть стринговый массив нужной высоты.
- Присвоить каждому элементу значение очередной переменной.
- Собрать в строку с помощью Join(Array,"").
Опять же быстрее выйдет.
Vach: Вариант с Array
| Код | Option Explicit Private mvarsMText() As String Private mvarsMTextCoun As Long
Public Property Let sText(ByVal vData As String) Clear mvarsMTextCoun = 1 mvarsMText(0) = vData End Property
Public Property Get sText() As String sText = Join(mvarsMText, "") End Property
Public Sub Add(sText) If mvarsMTextCoun > UBound(mvarsMText) Then ReDim Preserve mvarsMText(mvarsMTextCoun + 1000) End If mvarsMText(mvarsMTextCoun) = sText mvarsMTextCoun = mvarsMTextCoun + 1 End Sub
Public Sub Clear() ReDim mvarsMText(0) ReDim mvarsMText(1000) mvarsMTextCoun = 0 End Sub
Private Sub Class_Initialize() Clear End Sub |
При сравнении получилось следующие Добавление 20 тысяч строк: ClassSAdd :O,200000000002213 ClassSAddArray :З,00000000051242E-02 C :4,84700000000629 Вывод: Array работает быстрее и при увеличении числа добавлений обгоняет всё больше.
Добавление 20 тысяч строк и чтение результата: ClassSAdd :7,59099999999872 ClassSAddArray :28,6109999999984 sText = sText & "Text" :21,9619999999939 Вывод: ClassSAdd работает быстрее и отрыв повышается при увеличении добавлений
Если нужно собрать строку быстро а читать результат только в конце тогда ClassSAddArray быстрее и на оборот. Akina спасибо! |