Что такое быстрый способ объединения строк в VBScript - PullRequest
0 голосов
/ 13 февраля 2020

Время конкатенации строк - это почти экспоненциальная функция конкатенаций сумм и общего размера целевой строки из-за перемещения памяти каждый раз, когда есть оператор типа myStr = myStr + anotherString

1 Ответ

0 голосов
/ 13 февраля 2020

Время конкатенации строк - это почти экспоненциальная функция конкатенаций сумм и общего размера целевой строки из-за перемещения памяти каждый раз, когда есть оператор типа 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

конец класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...