27. maj 2007 - 22:33Der er
6 kommentarer og 1 løsning
array der lister kategorier sløver siden helt vildt..
Hjælp, vi har en funktion på vores shop der sløver serveren helt vildt.
Nu flere kategorier, med under kategorier der er, nu langsomer køre siden.
Serveren er stor, has massere ram og CPU. det er testet på flere maskiner.
Alle reagere på samme måde. Nu flere kategorier, med under kategorier, nu langsom'er bliver den :(
er der nogle der har en ide om hvad der går galt. er det dem måde koden er lavet på? kunne det lavet om ? rettes ?? ------ Her er koden 2 funktioner Front end side --------
Function ListCategories(arrCats, lngParentCategoryID, lngSelectedID, strIndent) Dim A, strTemp, lngUBound, strClass, thisCat arrCats2 = GetCats() lngUBound = UBound(arrCats2, 2) For A = 0 To lngUBound If arrCats2(1, A) = lngParentCategoryID Then If lngExpandedCategoryID = arrCats2(0,A) Then strClass = "selectedCategory" strBullet = "<img src='/images/arrow_right.gif' style='border-width:0px;'>" Else strClass = "menuitem" strBullet = "" End If
strTemp = strTemp & strIndent & IIf(True Or arrCats2(4, A), "<a title=""" & arrCats2(2, A) & """ href=""/shop/category.asp?id=" & arrCats2(0, A) & """ class='" & strClass & "'>", "") & strBullet & " " & IIf(lngParentCategoryID = 0, "<b>", "") & arrCats2(2, A) & IIf(lngParentCategoryID = 0, "</b>", "") & IIf(True Or arrCats2(4, A), "</a>", "") strTemp = strTemp & "<br>" If InStr(strExpandedCats, "|" & arrCats2(0, A) & "|") > 0 Then strTemp = strTemp & ListCategories(arrCats2, arrCats2(0, A), lngSelectedID, strIndent & " ") End If End If Next ListCategories = strTemp End Function
Hvor tit ændrer kategorierne sig? Hvis det ikke er så tit, så er der jo ingen grund til at beregne dem hver gang side vises (hvis jeg forstår problemstillingen korrekt). Lav en fast streng een gang for alle, de få gange der rettes i kategorier - så kan det være ligemeget hvor lang tid det tager.
ups glemte at får noget med oven over det er det der Expand kats..
arrCatsTemp = GetCats() Sub ExpandCats(lngCategoryID) Dim A, strTemp, lngUBound arrCats1 = arrCatsTemp lngUBound = UBound(arrCatsTemp, 2) For A = 0 To lngUBound If arrCats1(0, A) = lngCategoryID Then strExpandedCats = strExpandedCats & lngCategoryID & "|" ExpandCats arrCats1(1, A) End If Next End Sub
Function ListCategories(arrCats, lngParentCategoryID, lngSelectedID, strIndent) Dim A, strTemp, lngUBound, strClass, thisCat arrCats2 = GetCats() lngUBound = UBound(arrCats2, 2) For A = 0 To lngUBound If arrCats2(1, A) = lngParentCategoryID Then If lngExpandedCategoryID = arrCats2(0,A) Then strClass = "selectedCategory" strBullet = "<img src='/images/arrow_right.gif' style='border-width:0px;'>" Else strClass = "menuitem" strBullet = "" End If
strTemp = strTemp & strIndent & IIf(True Or arrCats2(4, A), "<a title=""" & arrCats2(2, A) & """ href=""/shop/category.asp?id=" & arrCats2(0, A) & """ class='" & strClass & "'>", "") & strBullet & " " & IIf(lngParentCategoryID = 0, "<b>", "") & arrCats2(2, A) & IIf(lngParentCategoryID = 0, "</b>", "") & IIf(True Or arrCats2(4, A), "</a>", "") strTemp = strTemp & "<br>" If InStr(strExpandedCats, "|" & arrCats2(0, A) & "|") > 0 Then strTemp = strTemp & ListCategories(arrCats2, arrCats2(0, A), lngSelectedID, strIndent & " ") End If End If Next ListCategories = strTemp End Function
Jeg tror du må erkende, at dit koncept er forfejlet. Normalt siger man jo, at RAM er meget hurtigere end hardisken. Men at bruge en array til at søge sekventielt i, vil altid være langsommere end at bruge en databaseforespørgsel (i hvert fald så snart man overskrider en vis (meget lille) størrelse). En database kan jo bruge et index under sin søgning, og selv hvis databasen bruger sekventiel søgning vil den have adgang til kode-optimeringsrutiner, du slet ikke har hvis du bruger en "hjemmelavet" sekventiel søgefunktion i en array.
Personligt ville jeg omskrive det hele og basere søgningen på SQL forespørgsler. Det vil give en meget bedre performance.
Hvis du ikke ønsker at gøre det, og data i dit array er i sorteret rækkefølge, kan du måske opnå en mærkbar hastighedsforøgelse ved at bruge en binær søgning. I stedet for bevidstløst at søge fra start til slut, indtil du finder det rette tal, kunne du starte med at undersøge det midterste element. Hvis det er for stort ved du, at du kun skal søge længere oppe. Undersøg igen det midterste element i det område, det lå over det oprindeligt undersøgte element. På den måde kan du hurtigt skyde dig ind på det rigtige element. Dette gentages indtil det rette arrayelement er fundet. Men som sagt, det virker kun, hvis elementerne ligger i en sorteret orden. Det bedste ville efter min mening stadig være, at bruge MS SQL Servers formidable kræfter til at lave søgningen.
Det vi har efter at have læst jeres 2 indlæg er at ligge det hele over i Application. denne køres så kun hvis server bliver reboot, eller man opretter nye kat's. på den måde har vi optimeret det. sider der før tog op til 12 sec at loade, loader nu på under ½ sec. weeee
Så nu virker det optimalt :) Tak for jeres svar og tid. Skriv svar begge to, så give jeg point. :)
Jeps det gav så meget det der. kan ikke mærke det på systemer med kun få kats men er der mange kats og mange under kats + en server der måske køre 50% load, ja så er det helt uundværligt..
Synes godt om
Ny brugerNybegynder
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.