26. januar 2006 - 09:51Der 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()
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?
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.
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?
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.
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.
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).
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.
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 :)
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 :-)
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... :)
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 :-)
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.