17. august 2003 - 16:04Der er
14 kommentarer og 2 løsninger
Bedste performance til ordbog
Jeg skal lave en ordbogsagtig funktion, som erstatter bestemte ord i en tekst med et link til en side.
Det er jo ikke så kompliceret at lave en replace(str,ord,link) men jeg er lidt bekymret over ydeevnen. Ordene der skal ledes efter ligger nemlig i en database (ca. 60-70 forskellige ord - måske flere) og teksten der skal ledes i ligger i en anden tabel i basen.
er der nogen der kender en bedre måde at gøre det på end at lave en replace-funktion for hvert eneste ord der skal ledes efter?
Er teksten meget stor? jeg vil da gætte på, at det er databaseopslagene, der tager mest tid. Lav nogle forsøg først, for at se om replace er for langsom.
...og det er jo stadig en hel masse replace. Jeg kan ikke helt gennemskue at lave regExp'ene så komplicerede. Ville det være muligt, at lave ét som indeholdt alle ord?...og kan du vise mig hvordan?
nmh > Teksternes omfang varierer. Ligger typisk på 6000-8000 karakterer. Replace funktionerne dræber den ikke, men jeg tænker også lidt på, hvad der sker når 10 mennesker henter sider samtidig. Min egen 2,5GHz puter laver et hop til 50% CPU nå jeg henter en side.
Hvis du henter et ord, derefter kører replace, henter et nyt ord etc. så tror jeg nok belastningen på serveren vil blive udjævnet. men det må komme an på en prøve. Inden man bruger en masse tid på de regulære udtryk, så se først om det simple ikke er godt nok.
Det var så det, du selv var inde på. Men prøv så at aflæse, hvor lang tid det egentlig tager. Det burde være meget minimalt. NB: Det sidste tal i Replace-funktionen angiver, at vi ønsker at lave en tekstsammenligning (der ikke er case-sensitive). Binær sammenligning markeres med et 0.
Jeg er ikke just ekspert i at lave smart regExp's men det kunne måske være en mulighed at lave et regExp med alle ordene? Det ville jeg f.eks. gerne vide om var muligt.
Hvormeget tid spares ved at benytte RegExp i forhold til det helt simple med replace? Min filosofi er: Brug altid det helt simple, hvis der ikke vindes noget væsentligt ved mere indviklede metoder.
Jeg er ikke ude på at spare tid på programmeringen. Funktionen skal bruges til et system med temmeligt mange brugere, og hvis jeg kan spare 25% serverbelasstning pr. side der hentes, så kan det mærkes for hver enkelte bruger.
...og min folisofi er, altid at finde den mest optimale løsning på et problem - også selvom det tager lidt tid ;-)
Med tid mente jeg faktisk ikke programmerings tiden men den tid der bruges af serveren. Og hvis der her kun er en marginal forbedring, så er det den simple løsning der "vinder". Men har du målt en forbedring på 25%?
Når jeg kører scriptet med replace-funktionen går CPU belastningen 25-35% op, i forhold til kørsel uden replace. Det synes jeg er temmeligt meget, hvis der hentes bare 10-15 sider samtidigt. Systemet vil have ca. 1000 brugere, så det er i virkeligheden sikkert urealistisk lavt.
Tror ikke du skal hænge dig så meget i den CPU-procent. Afprøv det i praksis, når der er mange brugere. Hvis det begynder at gå irriterende langsomt, kan du overveje, hvad du så vil gøre. Men det burde overhovedet ikke være noget problem. Kan godt være, at der er 1000 sessions på én gang, men hvor mange tror du opdaterer samme side på samme millisekund? Mit bud er højest 2-3.
Nu ved jeg ikke, hvilken database du anvender, men jeg går ud fra, det ikke er Access med alle de brugere. Jeg ved, MySQL har en Replace-funktion, du kan bruge i selve dit SQL-statement, så ASP slipper for at gøre det. ---------> Replace(Column, Find, Replace)
Se nu begynder det at ligne noget (med MySQL'en) :) Jeg bruger godt nok MS SQL 2000, men hvis du kender til lignende funktioner er jeg meget nysgerrig.
..mht. om det var svar nok: som titlen på spørgsmålet antyder, er jeg ikke ude efter en løsning der fungerer - men den løsning der fungerer bedst. Systemet jeg laver vil udvikle sig med tiden, og der vil 100% komme nye funktioner, som også kræver CPU kraft. Jeg forsøger blot at være på forkant, så jeg ikke sidder om 1 år med 10 semi-gode løsninger, som sløver hele sytemet - hvis du forstår :)
netro > ikke helt nok, men her er lidt for indsatsen alligevel
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.