D
Darker
Наверняка поднимаю "избитую" тему.
Пример задачи, необходимо пройтись по коллекции, достать из каждого документа данные. В конце обработки получить строку с данными из коллекции.
Напрашивается очевидный метод обхода:
А есть альтернативный подход: собрать массив строк, затем в конце массив объединить в строку
Методом профилирования кода (который был в агенте), мною было замечено, что второй подход отрабатывает намного быстрее. В попытках объяснить сей факт не хочу выглядеть дилетантом, поэтому нуждаюсь в Вашем мнении об этом. (Подозреваю, что загвоздка с работой с памятью).
В связи с этим, написал класс для работы со строками. И перед тем как, его использовать "в производстве", прошу вас выявить недостатки:
Пример задачи, необходимо пройтись по коллекции, достать из каждого документа данные. В конце обработки получить строку с данными из коллекции.
Напрашивается очевидный метод обхода:
Код:
...
Dim s as String
while not doc is nothing
...
s=s+doc.GetitemValue("TestField")(0)
...
wend
...
Код:
...
Dim i as long
i=0
while not doc is nothing
...
Redim preserve s(i) as string
s(i)=doc.GetitemValue("TestField")(0)
i=i+1
...
wend
s1=join(s)
...
В связи с этим, написал класс для работы со строками. И перед тем как, его использовать "в производстве", прошу вас выявить недостатки:
Код:
Public Class PROTOTYPE_STRING
Private stringArray() As String 'Массив строк
Private extStringArray() As String 'Вспомогательный массив, на случай если превысит лимит массива или лимит строки в байтах(если включен игнор лимита)
Private i As Integer 'Счетчик для основного массива
Private j As Integer 'Счетчик для вспомогательного массива
Private stringLength As Double 'Счетчик размера строки в байтах
Private isToCheckLength As Boolean 'Флаг о необходимости проверки превышения лимита строки в байтах
Private isToIgnoreLimit As Boolean 'Флаг об игнорировании превышения лимита строки в байтах
Private isOutOfLimit As Boolean 'Флаг о превышении лимита строки в байтах
Public Sub New 'Конструктор
Truncate 'Зануляем все переменные
Me.isToCheckLength=True 'Делаем необходимым проверку превышения лимита строки в байтах
Me.isToIgnoreLimit=False 'Отказываемся об игнорирования превышения лимита строки в байтах
End Sub
Public Property Get ToCheckLength As Boolean
ToCheckLength=Me.isToCheckLength
End Property
Public Property Set ToCheckLength As Boolean
Me.isToCheckLength=ToCheckLength
End Property
Public Property Get ToIgnoreLimit As Boolean
ToIgnoreLimit=Me.isToIgnoreLimit
End Property
Public Property Set ToIgnoreLimit As Boolean
Me.isToIgnoreLimit=ToIgnoreLimit
If Me.isToIgnoreLimit Then Me.isToCheckLength=True 'Если игнорируем превышения лимита строки в байтах, то делаем необходимым проверку превышения лимита строки в байтах
End Property
Public Sub Truncate
Erase Me.stringArray 'Зачищаем массив строк
Erase Me.extStringArray 'Зачищаем вспомогательный массив строк
Me.i=0 'Зануляем счетчик массива строк
Me.j=0 'Занулям счетчик вспомогательного массива
Me.stringLength=0 'Зануляем счетчик размера строки в байтах
Me.isOutOfLimit=False 'Предполагаем, что лимит строки в байтах не превышен
End Sub
Public Function Add(stringToAdd As String) As Boolean
On Error Goto erH
Add=True
If Me.isToCheckLength Then 'Если нуждается в проверке превышения лимита строки
Dim currentStringLength As Long
currentStringLength=Lenb(stringToAdd) 'Берем размер текущей строки в байтах
Me.stringLength=Me.stringLength+currentStringLength 'Прибавляем его к основному счетчику размера строки в байтах
If (Me.stringLength)>2147483647 Then 'Если превысил лимит строки
If Me.isToIgnoreLimit Then 'Если игнорируем ограничения,
me.isOutOfLimit=True
ThrowToExt 'то перекидываем содержимое массива, в вспомогательный массив, объединяя в строку
Me.stringLength=0 'зануляем счетчик размера строки в байтах
Else 'иначе
Msgbox "Превышен лимит строки в 2G!" 'показываем сообщение о превышении,
Add=False
Exit Function
End If
End If
End If
Redim Preserve Me.stringArray(Me.i) As String
Me.stringArray(Me.i)=stringToAdd 'Даем новому элементу массива значение текущей строки
Me.i=Me.i+1
If Me.i=32767 Then ThrowToExt 'Если превысит лимит массива, то перекидываем содержимое массива строк в вспомогательный массив, объединяя в строку
exF: Exit Function
erH: Msgbox Error + " in "+Getthreadinfo(1)+" on line "+Cstr(Erl)
Resume exF
End Function
Private Sub ThrowToExt
Redim Preserve extStringArray(Me.j) As String
extStringArray(Me.j)=Join(Me.stringArray,Chr(10)) 'Перекидываем содержимое массива строк в вспомогательный массив, объединяя в строку
Me.j=Me.j+1
Erase Me.stringArray 'Зачищаем массив строк
Me.i=0
End Sub
Public Function Value As Variant
On Error Goto erH
ThrowToExt 'Перекидываем содержимое массива строк в вспомогательный массив, объединяя в строку
If Me.isOutOfLimit Then 'Если превысил лимит строки в байтах,
Value=Me.extStringArray 'то возвращем вспомогательный(объединенный) массив строк
Else 'иначе
Value=Join(Me.extStringArray,Chr(10)) 'Возвращаем вспомогательный массив строк, объедененный в строку
End If
exF: Exit Function
erH: Msgbox Error + " in "+Getthreadinfo(1)+" on line "+Cstr(Erl)
Value=""
Resume exF
End Function
Sub Delete
Truncate
End Sub
End Class