Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как добавить много текста в стринговую переменную?


Автор: cardinal 19.3.2007, 01:20
Если нужно много добавлять в текстовою переменную
Код
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 спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)