/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Hvordan kører mine ASP sider hurtigst?
Fra : Peter Nielsen


Dato : 30-01-08 21:18

Hej

Jeg har et par spørgsmål. Har lagt mærke til at nogle af mine
hjemmesider er begyndt at kører utrolig langsomme... mest fordi
at jeg nok har en masse funktioner kørende samtidig. Har ikke
nogle konkrete eksempler, men mit spørgsmål kører egentlig bare
på hvilke teknikker man bør bruge for at få ens sider til at køre
mest optimal

Fx så gik jeg idag og tænkte på at lave en simpel
orddelingsfunktion... Noget ala:

function orddeling(text)
strlen = len(text)
bogstavcount = 1
wordcount = 0
do until bogstavcount = strlen
bogstav = mid(text,bogstavcount,1)
if bogstav = " " then
wordcount = 0
else
wordcount = wordcount + 1
end if
if wordcount = 20 then
bogstav = bogstav & "<br/>"
end if
nytekst = nytekst & bogstav
bogstavcount = bogstavcount + 1
loop
orddeling = nytekst
end function


Altså sådan noget i den dur... men det ville jo kræve at den
skulle køre mine tekster igennem for ALLE tegn hver gang... og
det er da en funktion der bliver loopet en del... men var det
noget at en alm side ville kunne trække nemt? eller ville det
være for hårdt for en alm hjemmeside??

Altså hvor mange gange kan sådan et loop der ca gentage sig selv
i sekundet??

Og hvad med databaseudtræk?? har rimelig mange sider med mange
databaseudtræk (access db)... så forleden lavede jeg en side hvor
den gik en kalender igennem.. 3 måneder per side.. Men et par
databaseudtræk per dag... det tager faktisk sådan at man kan se
den generer siden.. og det er jo for langsomt (er så igang med at
skifte til MySQL) men ved i hvor mange databaseudtræk den kan
tage? Er det smartere at lave alle databaseudtræk foroven i et
loop og så bruge variabler? Hvad med Sessions og Cookies? er det
også sværere for en side at genere en session i stedet for at
placere session i en variabel? :)

Kan godt være at det kan lyde som dumme spørgsmål, men har aldrig
været så god til at smide alt i variabler og sådan, og er ved
være træt af at mine sider bliver langsomme :)

Håber i forstår hvad jeg mener og kan hjælpe mig med at forstå
the backbone af ASP :)

/Peter Nielsen





--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Stig Johansen (30-01-2008)
Kommentar
Fra : Stig Johansen


Dato : 30-01-08 23:51

Jeg bruger ikke så meget ASP, så om det hurtigst eller ej, ved jeg ikke.
Men her er nogle 'tal' herfra:
Server : AMD-? 850 Mhz 256 MB RAM. (W2K/IIS 5.0/Access97)
Pc - I : AMD-? 850 Mhz 512 MB RAM. (W2K - Firefox)
Pc-II : PII 350 Mhz 512 MB RAM. (SuSE 8.2 - Konqueror 3.3.1)
Båndbredde 100 Mbps (LAN)

Peter Nielsen wrote:
> Hej
>
> Jeg har et par spørgsmål. Har lagt mærke til at nogle af mine
> hjemmesider er begyndt at kører utrolig langsomme... mest fordi
> at jeg nok har en masse funktioner kørende samtidig. Har ikke
> nogle konkrete eksempler, men mit spørgsmål kører egentlig bare
> på hvilke teknikker man bør bruge for at få ens sider til at køre
> mest optimal
>
> Fx så gik jeg idag og tænkte på at lave en simpel
> orddelingsfunktion... Noget ala:
>
> function orddeling(text)
> strlen = len(text)
> bogstavcount = 1
> wordcount = 0
> do until bogstavcount = strlen
> bogstav = mid(text,bogstavcount,1)
> if bogstav = " " then
> wordcount = 0
> else
> wordcount = wordcount + 1
> end if
> if wordcount = 20 then
> bogstav = bogstav & "<br/>"
> end if
> nytekst = nytekst & bogstav
> bogstavcount = bogstavcount + 1
> loop
> orddeling = nytekst
> end function

Hvis du kigger på den posr jeg lavede for lidt siden, så vil du se, at ved
konvertering fra Ansi - UTF-8, looper jeg alle karakterer igennem, og danne
en ny streng.
Jeg har noget kørende, hvor jeg henter 802 meddelser af forskellig længde.
Hver eneste af dem bliver kørt gennem Ansi - UTF8, som så checker hver
eneste karakter.
Derudover er der også nuget rekursivt replace af 45 streng 'sæt' "<" ->
"&lt;" og den slags.
Dvs hver af de 802 meddelser bliver tjekket 45 gange pr. stk.
Resultatet bliver skiftet ud i en div i browseren.
Jeg skriver alt det her fordi der er mange parametre, når man måler på
sysindtryk.
Nå, men på min FF tager det under 1 sekund før skærmen er opdateret.
Den er nok 5 år gammel, så grafikkortet...?

På Konquerorer tager det i omegnen af 2 sekunder.

> Altså sådan noget i den dur... men det ville jo kræve at den
> skulle køre mine tekster igennem for ALLE tegn hver gang... og
> det er da en funktion der bliver loopet en del... men var det
> noget at en alm side ville kunne trække nemt? eller ville det
> være for hårdt for en alm hjemmeside??

Se ovenfor.

>
> Altså hvor mange gange kan sådan et loop der ca gentage sig selv
> i sekundet??

Tilsyneladende mange. Jeg tjekker lige en aktuel størrelse.... skifter lige
over på anden PC.... tilbage om lidt...
Tilbage igen..
Den siger 91KB, men det er inklusive html tags, så 45 KB er nok deromkriing.

Det vil sige _samtlige_ 45.000 tegn er tjekket +
der er tjekket for strenge 802*45 = 36090 replaces.

> Og hvad med databaseudtræk??

Hov, tiden er inklusive databaseudtræk af de 802 meddelser.
Join af to tabeller, lidt kriterier og sortering.

> har rimelig mange sider med mange
> databaseudtræk (access db)... så forleden lavede jeg en side hvor
> den gik en kalender igennem.. 3 måneder per side.. Men et par
> databaseudtræk per dag... det tager faktisk sådan at man kan se
> den generer siden.. og det er jo for langsomt

Så bruger du nok Access forkert.

> (er så igang med at
> skifte til MySQL)

Tvivler på det er en fordel på ASP sider.

> men ved i hvor mange databaseudtræk den kan
> tage?

Kender den ikke, men alle databaser performer afhængigt af hvordan man
bruger den.
_Alle_ databaser performer ad helvede til hvis man anlægger en desktop
approach.

> Er det smartere at lave alle databaseudtræk foroven i et
> loop og så bruge variabler?

Ikke forstået - HTTP er stateless.

> Hvad med Sessions og Cookies?
En 'session' er bare noget global hukommelse i IIS'en, der styres via
Cookies.

> er det
> også sværere for en side at genere en session i stedet for at
> placere session i en variabel? :)

Ikke forstået.

> Kan godt være at det kan lyde som dumme spørgsmål, men har aldrig
> været så god til at smide alt i variabler og sådan, og er ved
> være træt af at mine sider bliver langsomme :)

Der findes kun ét dunt spørgsmål - det, der _ikke_ blev stillet.

> Håber i forstår hvad jeg mener og kan hjælpe mig med at forstå
> the backbone af ASP :)

Hvis du kigger på den 'Function UTF8toAnsi (UTF8String)' fra min tidligere
post, er det faktisk en slags orddeling med chr(195) , du kan lege med at
bruge " " i stedet for chr(195).
hint: i UTF8toAnsi = UTF8toAnsi + Mid (UTF8String,S,P-S) ' non ascii
er 'Mid (UTF8String,S,P-S) ' på en måde det fundne ord.

Du skrev før
> har rimelig mange sider med mange
> databaseudtræk (access db)... så forleden lavede jeg en side hvor
> den gik en kalender igennem.. 3 måneder per side.

Hvis du smider lidt kode hvor du laver databaseudtrækket, kan det være du
kan få et par hint's.

--
Med venlig hilsen
Stig Johansen

Peter Nielsen (31-01-2008)
Kommentar
Fra : Peter Nielsen


Dato : 31-01-08 09:38


> Nå, men på min FF tager det under 1 sekund før skærmen er opdateret.
> Den er nok 5 år gammel, så grafikkortet...?
>
> På Konquerorer tager det i omegnen af 2 sekunder.
>

Altså det vil sige at det også handler om hvor hurtigt din computer er??
Sidder jo fandme på en Mac med Core 2 Duo 2,8 ghz og 4 gb ram... så håber jeg
godt nok ik har noget at sige da!


>
> Tilsyneladende mange. Jeg tjekker lige en aktuel størrelse.... skifter lige
> over på anden PC.... tilbage om lidt...
> Tilbage igen..
> Den siger 91KB, men det er inklusive html tags, så 45 KB er nok deromkriing.
>
> Det vil sige _samtlige_ 45.000 tegn er tjekket +
> der er tjekket for strenge 802*45 = 36090 replaces.

Cool.. så kan man jo sagtens gøre det :)


> Så bruger du nok Access forkert.

Hmm... Syns bare jeg stiller det meget enkelt op egentlig... den skal bare
trække en masse udtræk fra nogle felter... handler om at man kan sætte nogle
opgaver ind på en dag.. og så gør jeg det at for hver dag der er, beder jeg
den om at tjekke min opgavedatabase igennem for om der er en opgave til den
dag. Meget simpelt.



> Tvivler på det er en fordel på ASP sider.

(MySQL altså) Jeg skulle engang prøve at lave et udtræk på 10.000 poster...
prøvede først i Access og det kunne den slet ik... Der var MySQL MEGET bedre,
så det tror jeg er ok faktisk :)

> _Alle_ databaser performer ad helvede til hvis man anlægger en desktop
> approach.

Hvad er en desktop approach? :)

> > Er det smartere at lave alle databaseudtræk foroven i et
> > loop og så bruge variabler?
>
> Ikke forstået - HTTP er stateless.

Altså skrive foroven:
MitNavn = rs("mitnavn")

Og så bruge den hele MitNavn variablen hele vejen ned igennem siden i stedet
for at bruge rs("mitnavn") hele vejen ned... altså "kalder den op" til
databasen hver gang med begge metoder eller hvordan?


> > Hvad med Sessions og Cookies?
> > er det
> > også sværere for en side at genere en session i stedet for at
> > placere session i en variabel? :)

Samme metode... Har sådan en ide om at hvis du laver det til et variabel så
skal den ikke "ringe op" til serveren hver gang men requester den :)

> Hvis du kigger på den 'Function UTF8toAnsi (UTF8String)' fra min tidligere
> post, er det faktisk en slags orddeling med chr(195) , du kan lege med at
> bruge " " i stedet for chr(195).
> hint: i UTF8toAnsi = UTF8toAnsi + Mid (UTF8String,S,P-S) ' non ascii
> er 'Mid (UTF8String,S,P-S) ' på en måde det fundne ord.

Puha mange ord jeg ik forstår?! :)

> Hvis du smider lidt kode hvor du laver databaseudtrækket, kan det være du
> kan få et par hint's.

Det er et meget langt kode... men laver en For -> Next løkke som kører alle
dage i Jan, Feb og Marts igennem... 90 dage ca ik.. og for hver dag tjekker
den databasen igennem for opgaver, og så laver den også en "indsæt ny opgave"
felt under... og der trækker den lidt user-information, og en session og
lidt.. har lidt talt det hurtigt op... for hver dag udfører den: 5 funktioner
(sikkert med databaseudtræk), 35 databaseudtræk og et sessionudtræk. Det skal
man jo så gange med 90 ik... og den side tager den nok omkring 2-3 sek om at
genere.



--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jørn Andersen (31-01-2008)
Kommentar
Fra : Jørn Andersen


Dato : 31-01-08 10:33

On 31 Jan 2008 08:38:15 GMT, Peter Nielsen <pedn@pedn.dk> wrote:

>> > Er det smartere at lave alle databaseudtræk foroven i et
>> > loop og så bruge variabler?
>>
>> Ikke forstået - HTTP er stateless.
>
>Altså skrive foroven:
>MitNavn = rs("mitnavn")

En tommelfinger-regel:
Skal du kun bruge værdien én gang, så er det lige meget. SKal du bruge
den samme værdi flere gange, så tildel en variabel.

<snip>
>Det er et meget langt kode... men laver en For -> Next løkke som kører alle
>dage i Jan, Feb og Marts igennem... 90 dage ca ik.. og for hver dag tjekker
>den databasen igennem for opgaver, og så laver den også en "indsæt ny opgave"
>felt under... og der trækker den lidt user-information, og en session og
>lidt.. har lidt talt det hurtigt op... for hver dag udfører den: 5 funktioner
>(sikkert med databaseudtræk), 35 databaseudtræk og et sessionudtræk. Det skal
>man jo så gange med 90 ik... og den side tager den nok omkring 2-3 sek om at
>genere.

Lyder som om du med fordel kunne lave et udtræk af hele datasættet for
perioden (altså optimér din SQL). Brug evt. .GetRows-metoden, som
trækker det over i et array - så slipper du for at have forbindelsen til
databasen åben i lang tid.

Men det er lidt svært at se uden kode. Post evt. dit eksempel.


Mvh. Jørn

--
Jørn Andersen,
Brønshøj

Stig Johansen (31-01-2008)
Kommentar
Fra : Stig Johansen


Dato : 31-01-08 13:04

Peter Nielsen wrote:

> Altså det vil sige at det også handler om hvor hurtigt din computer er??

Næh tværtimod, det er noget gammelt noget.

> (MySQL altså) Jeg skulle engang prøve at lave et udtræk på 10.000
> poster... prøvede først i Access og det kunne den slet ik... Der var MySQL
> MEGET bedre, så det tror jeg er ok faktisk :)

Ok - do as you will. Jeg er ikke access fanatiker, ej heller µSQL.
Denne her:
SELECT
Users.Username,Messages.MessageType,Messages.MessageBody,Messages.MessageTime
FROM Messages
INNER JOIN Users ON Users.UserId=Messages.MessageUserId
WHERE MessageId > 0
ORDER BY MessageId,MessageUserId DESC

tager et spltsekund, og

SELECT Count(*)
FROM Messages
INNER JOIN Users ON Users.UserId=Messages.MessageUserId
WHERE MessageId > 0

returnerer 1781 records found

[moving a little]
> Hvad er en desktop approach? :)

> Altså skrive foroven:
> MitNavn = rs("mitnavn")
>
> Og så bruge den hele MitNavn variablen hele vejen ned igennem siden i
> stedet for at bruge rs("mitnavn") hele vejen ned... altså "kalder den op"
> til databasen hver gang med begge metoder eller hvordan?

rs("mitnavn") eksisterer kun så længe rs er open.

> Samme metode... Har sådan en ide om at hvis du laver det til et variabel
> så skal den ikke "ringe op" til serveren hver gang men requester den :)

Al ASP kører på _serveren_, ellers skal du have fat i noget AJAX og JS
lokale variable.

>> Hvis du kigger på den 'Function UTF8toAnsi (UTF8String)' fra min
>> tidligere post, er det faktisk en slags orddeling med chr(195) , du kan
>> lege med at bruge " " i stedet for chr(195).
>> hint: i UTF8toAnsi = UTF8toAnsi + Mid (UTF8String,S,P-S) ' non ascii
>> er 'Mid (UTF8String,S,P-S) ' på en måde det fundne ord.
>
> Puha mange ord jeg ik forstår?! :)

Jeg referede til kodestumper i en tidligere post i gruppen, ikke generelle
udtryk.

> Det er et meget langt kode... men laver en For -> Next

moved to here:
> Hvad er en desktop approach? :)
Hvis du udtager et client dataset, så får man en lokal 'kopi' af det dataset
man har valgt. Jo større det er, jo mere fylder det, og samtidig sørger
databasen for, der er låst for andre opdateringer.
Den hurtigste approach er (fast forward) serverside readonly cursor.

For hver kan man så lave en "INSERT INTO..." eller "UPDATE ..."

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste