Время конкатенации строк - это почти экспоненциальная функция конкатенаций сумм и общего размера целевой строки из-за перемещения памяти каждый раз, когда есть оператор типа myStr = myStr + anotherString
Код ниже основан на идее, взятой из http://nerds-central.blogspot.com/2007/04/high-speed-string-concatenation-in-100.html?m=1. Идея состоит в том, чтобы использовать однонаправленный связанный список объектов для предотвращения дорогостоящего перераспределения памяти. Я оптимизировал код для довольно большого количества конкатенаций, чтобы уменьшить количество элементов в списке, так как излишние числа вызывали сбои в IIS.
Вариант использования объединяется несколько раз, после чего получается полученная строка
В моем тестировании удалось объединить более 10000 строк общим объемом 25 МБ
'Example of use:
dim str="Quite a long-long-long-long-long-long-long string here"
dim oStr,resultString
set oStr= new FStringCat
for i= 1 to 100000
oStr.Add(str)
Next
resultString = oStr.ToString() ' this will take some time
'====================================
class FStringCat
private sp
private ep
private l
private accum
private maxLen
private objCount
private bigString
private switched
public Length
private sub Class_Initialize
l=0
accum=""
set sp=nothing
Length=0
maxLen=2800
objCount=0
end sub
public sub Add(what)
Length=Length+len(what)
if switched then
bigString.Add(what)
exit sub
end if
if objCount>1200 then ' prevent IIS crash
set bigString=new FastStringHV
bigString.Add(accum)
bigString.Add(what)
switched=true
exit sub
end if
accum=accum & what
if len(accum)> maxLen then ' originally 2800
objCount=objCount+1
if objCount>1000 then maxLen=15000
if(sp is nothing) then
set ep=new XLink
set sp=ep
else
dim oep
set oep=ep
set ep=new XLink
set oep.nextXLink=ep
end if
ep.datum=accum
accum=""
l=l+1
end if
end sub
public function ToString()
if l=0 then
toString=accum
exit function
end if
ep.datum=ep.datum & accum
while l>1
dim ptr: set ptr=sp
dim nsp : set nsp=new XLink
dim nep : set nep=nsp
dim nl : nl=0
while not (ptr is nothing)
if nep.datum="" then
nep.datum=ptr.datum
nl=nl+1
else
if ptr.datum<>"" then nep.datum=nep.datum & ptr.datum
set nep.nextXLink=new XLink
set nep=nep.nextXLink
end if
set ptr=ptr.nextXLink
wend
set sp=nsp
set ep=nep
l=nl
wend
if switched then
ToString=sp.datum +bigString.ToString()
else
ToString=sp.datum
end if
end function
конечный класс
class XLink publi c datum publi c nextXLink private sub Class_Initialize set nextXLink = nothing datum = "" end sub end class
'HV класс FastStringHV частный longStr частный str
private sub Class_Initialize
str=""
longStr=""
end sub
public sub Add(what)
if len(str) > 2800 then
longStr=longStr+str
str=""
end if
str=str+what
end sub
public function ToString()
if len(longStr) = 0 then
ToString=str
elseif len(str)=0 then
ToString=longStr
else
ToString=longStr+str
end if
end function
конец класса