Avatar billede hulla Novice
26. januar 2006 - 09:51 Der er 15 kommentarer og
1 løsning

Opbygning af side med streng

Hej

Jeg har en side jeg opbygger med en streng.
Jeg har fået ideen til opbyggelsen herinde på eksperten.
Grunden til denne måde, skulle være at hastigheden skulle være bedre end ved f.eks. document.write()

Det foregår sådan her:

sb.Append("<table border=""0"">")
sb.Append("<tr><td colspan=""2""><b>Top</b></td></tr>")
..... osv.
   
class StringBuilder   
    private m_arrStrings
    private m_posNew
    private m_ubound   
   
    private sub Class_Initialize()
        redim m_arrStrings(100)
        m_ubound = ubound(m_arrStrings)
        m_posNew = 0
    end sub   
   
    public property get bufferSize
        bufferSize = m_ubound
    end property

    public property let bufferSize(value)
        if m_posNew > 0 then
            m_posNew = 1
        end if
        m_arrStrings(0) = Join(m_arrStrings,"")
        redim preserve m_arrStrings(value)
        m_ubound = ubound(m_arrStrings)
    end property

    public sub incBufferSize(incSize)
        bufferSize = bufferSize + incSize
    end sub   
   
    public sub Append(newString)
        m_posNew = m_posNew + 1
        if m_posNew > m_ubound then
            m_arrStrings(0) = Join(m_arrStrings,"")
            for iss = 1 to m_ubound
                m_arrStrings(iss) = ""
            next
            m_posNew = 1
        end if       
        m_arrStrings(m_posNew) = newString
    end sub
   
    public function toString()
        toString = Join(m_arrStrings,"")
    end function
end class

sb.toString()

Mit problem er at jeg har en mistanke om at det tager en masse serverkraft at opbygge en side på denne måde.
Der kan være op til 250 linjer opbygget sådan her på en side.
Jeg kan ikke måle at det tager specielt meget tid, men det tager måske mange ram?
Nogen der har en mening om det?
Eller om strengopbygning generelt?
Avatar billede dr_chaos Nybegynder
26. januar 2006 - 09:56 #1
du kan jo prøve at lave 2 response.write med et timestamp en som ligger i toppen og en i bunden.
Så kan du få en ide om tidsfaktoren.
Avatar billede softspot Forsker
26. januar 2006 - 10:08 #2
Det ligner noget kode jeg har lavet... der mangler bare copyright-meddelelse og kommentarer, så er det identisk :)

Anyway! Jeg lavede nogle tests med den kode og selvom den er væsentlig hurtigere (omkring 100 gange alt efter hvilken streng man arbejde med) end den gængse måde at sammensætte strenge på (med ampersand, dvs. &), så er den stadig langsommere end at udskrive strengen direkte til response med write-funktionen. Hvis du kan undgå at cache strengen, vil du, som du selv er inde på spare både tid og resurser, så det er at anbefale.

Den originale kode (med kommentarer og copyrightmeddelelse) og en forklaring til metoden der benyttes i klassen kan findes på http://www.softspot.dk/forside/erfaringsdeling/stringbuilder.aspx
Avatar billede hulla Novice
26. januar 2006 - 10:10 #3
Det tager ingen tid at køre siden.
Får ca 0,035 i forskel på Timer fra starten til Timer i slutningen af scriptet.
Avatar billede hulla Novice
26. januar 2006 - 10:12 #4
Ja det var dig softspot og på siden er kommentarer og copyright intakt, :-)

Det er ikke hastigheden jeg er bange for,. det går ret tjept at få siden frem. Det er om det tager mange ram, som kan mærkes hvis man har rigtig mange samtidige brugere?
Avatar billede softspot Forsker
26. januar 2006 - 10:27 #5
Der kan ikke være nogen tvivl om at StringBuilder tager mere RAM end at bruge response.write, da strengen jo skal gemmes i hukommelsen mens den opbygges og der arbejdes med den.

Når du skriver document.write i dit spørgsmål, går jeg ud fra at du mener response.write og hvis det er tilfældet, så er grundlaget for dit valg baseret på forkerte oplysninger, for response.write viste sig i mine tests at være omkring 100 gange hurtigere end StringBuilder-klassen, så der findes nok ikke noget i VBScript der kan overgå den metode.

Grunden til at vælge StringBuilder over response.write skulle være at du synes den er lettere at benytte eller at du f.eks. har brug for at opbygge flere strenge som ikke skal udskrives i sekvens men som baserer sig på det samme recordset.

Eksempel:

Forestil dig at du har et galleri, hvor du gerne vil vise billeder i første række og tekst i anden række og så billeder i tredie række og tekst i fjerde række osv. Her kunne man f.eks. opbygge en cache som gemme tekstrækken i en streng og udskriver HTML til response.write med det samme. Når billederækken så udskrevet kan man skrive den cachede tekstrækken med response.write, inden næste billederække genereres.
(Jeg ved dette også kan klares ved at indlejre en tabel i hver celle, men det bliver HTML-koden jo ikke speciel "slank" af :)).

StringBuilder-klassen bør altså ikke bruges med mindre du ikke kan gennemskue hvordan du skal generere dit indhold sekventielt med response.write og føler det nødvendigt at cache dine strenge til senere output.
Avatar billede hulla Novice
26. januar 2006 - 10:33 #6
Jeg er blevet meget glad for StringBuilder klassen pga megen dynamik på min side.

Vi er vel enige om at så snart et script afsluttes og siden sendes til klienten, så frigives alle ram igen?

Hvis vi er enige om det, burde det vel aldrig blive et problem når siden afvikles så hurtigt..eller ?
Avatar billede softspot Forsker
26. januar 2006 - 10:34 #7
Generelt vil jeg mene flg. tommelfingerregel bør benyttes: Hvis du ville have brugt gængs strengsammensættelse (altså med &), så brug StringBuilder i stedet, ellers brug Response.Write.

Når du sammensætter strenge med &, så vil du bruge en tilsvarende mængde hukommelse som StringBuilder bruger og RAM-forbruget vil derfor ikke være væsentlig anderledes end ellers - men det vil hastigheden.
Avatar billede hulla Novice
26. januar 2006 - 10:35 #8
Det du skriver om hastigheden betyder vel så at Response.write er 10.000 (ti tusinde) gange hurtigere end at bruge ampersand ? :-)
Avatar billede hulla Novice
26. januar 2006 - 10:38 #9
Er det ikke korrekt at alle ram frigives når et script er afsluttet, uden at jeg skal tænke på det?
Avatar billede softspot Forsker
26. januar 2006 - 10:39 #10
Du bør altid søge efter den mest effektive løsning når du arbejder på en server, da den jo deles af mange brugere og derfor potentielt set bliver mere belastet. Den betragtning vil gøre dine sites mere skalerbare (uden at du skal tilføje mere RAM eller større processor). Derfor er min anbefaling stadig: brug Response.Write hvor du kan, da den både er mere effektiv hvad RAM og performance angår (dvs. forbruger færre resurser og mindre tid).
Avatar billede softspot Forsker
26. januar 2006 - 10:42 #11
Jo, VBScript frigiver RAM efter de gængse scoperegler (eller burde i det mindst gøre det), dvs. når en side er udført, så bliver lokale variabler smidt væk og hukommelsen frigivet.
Avatar billede softspot Forsker
26. januar 2006 - 10:44 #12
Ja, 10.000 gange hurtigere end VBScrits egen strengsammensætning, igen alt efter omstændigederne, men jo flere strengsammensætninger du laver desto mere koster de, så du kan godt opleve endnu bedre resultater med response.write :)
Avatar billede hulla Novice
26. januar 2006 - 11:03 #13
Jeg har prøvet at lave det til Response.Write, men det kan altså ikke rigtig ses på hastigheden... kan være jeg skal kigge andre steder efter vores Ram problem :-)

Mange tak for inputtene dog,..smider du et svar?
Avatar billede softspot Forsker
26. januar 2006 - 11:15 #14
Hvordan er det Jeres RAM-problemer kommer til udtryk? Det kan jo være der er nogle andre omstændigheder der gør at I "lækker" RAM (hvis det er det der sker). Der kan f.eks. være tale om COM-objekter der genererer cirkulære referencer. Det kunne også være objekter eller andre former for data som gemmes i session-variable og dermed ikke bliver nedlagt fra request til request. Jeg tvivler på at det har noget med StringBuilder at gøre... så hvis du kan komme i tanke om andre elementer af Jeres site, som kunne være potentielle problemområder, så sig frem... :)
Avatar billede hulla Novice
26. januar 2006 - 12:41 #15
Vi har fået nogle server hajer til at kigge på serverne og de har vist fundet noget på den ene server som kunne være skyld i det. Noget hardwaremæssigt.

Om ikke andet har vi fået vores kode optimeret :-)

tak for hjælpen
Avatar billede softspot Forsker
26. januar 2006 - 13:34 #16
Velbekomme og tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester