/ 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
Hvorfor er Arrayet hurtigere end Recordsæt~
Fra : Jimmy


Dato : 07-07-03 15:54

Hej

Har en ASP side, hvor jeg skal køre en masse SQL, og lidt af hvert. Der er
dog noget der undrer mig:

Løsning 1:

set rs = linkDB.Execute("Select felt1.....")
if not rs.EOF then
while not rs.EOF
......rs("felt1") bliver jævnligt brugt i denne stump kode.
......
rs.MoveNext
wend
end if

Alle prikkerne i min while symboliserer at jeg kører en masse kode hvor jeg
jævnligt bruger attributten rs("felt1").
Det her går langsomt. Det går meget hurtigere hvis jeg i stedet gør sådan
her:

Løsning 2:

set rs = linkDB.Execute("Select felt1.....")
if not rs.EOF then
i = 0
while not rs.EOF
feltArray(i) = rs("felt1")
i = i + 1
rs.MoveNext
wend
max_i = i
end if
if i <> 0 then
i = 0
while i <= maxi
........feltArray(i) bliver jævnligt brugt i denne stump kode.
........
i = i + 1
wend
end if

Hvorfor går min kode 10 gange hurtigere (og det er en underdrivelse) når jeg
bruger løsning 2?
Jeg skal stadig igennem hele recordsættet, så for mig at se bruger jeg flere
instruktioner i Løsning 2. I mit hoved burde det betyde at løsning 2 var den
langsommeste. Det er den langt fra! Den eneste forskel jeg umiddelbart kan
se er at jeg i stedet for at referere til rs("felt1") en masse gange nu kan
referere til feltArray(i), så et eller andet siger mig at det koster en
masse at referere til rs("felt1") (altså til recordsættet).

Men hvorfor?

Håber at der er nogen der ligger inde med svaret?

--


Jimmy

--


Jimmy
www.graphicom.dk
www.timeatweb.com



 
 
Peter Lykkegaard (07-07-2003)
Kommentar
Fra : Peter Lykkegaard


Dato : 07-07-03 16:21


"Jimmy" <pleasereplyingroup@hotmail.com> wrote in message
news:3f09891d$0$5171$edfadb0f@dread11.news.tele.dk...

> Har en ASP side, hvor jeg skal køre en masse SQL, og lidt af hvert. Der er
> dog noget der undrer mig:

> jeg kører en masse kode hvor jeg jævnligt bruger attributten rs("felt1").

Lav en variable og brug den i stedet
fx
MyFieldValue = rs("felt1")

> set rs = linkDB.Execute("Select felt1.....")
> if not rs.EOF then

Brug GetRows...

> if i <> 0 then

Du kan tjekke på størrelsen i dit array

While I < UBound(feltArray)

> Hvorfor går min kode 10 gange hurtigere (og det er en underdrivelse) når
jeg
> bruger løsning 2?

Har du nogle tider
Umiddelbart er det problemet med kald til field objectet der ligger et
stykke nede i recordset hierarkiet

> Jeg skal stadig igennem hele recordsættet, så for mig at se bruger jeg
flere
> instruktioner i Løsning 2.

Erstat din løkke med GetRows - så vil det være endnu hurtigere
Evt kombineret med et firehose (read-/forwardonly) recordset

> I mit hoved burde det betyde at løsning 2 var den
> langsommeste. Det er den langt fra! Den eneste forskel jeg umiddelbart kan
> se er at jeg i stedet for at referere til rs("felt1") en masse gange nu
kan
> referere til feltArray(i), så et eller andet siger mig at det koster en
> masse at referere til rs("felt1") (altså til recordsættet).

Nej det er den manglende direkte reference til field objectet der er den
største synder
Det koster at lave opslag i et object hierarki

mvh/Peter Lykkegaard



Jimmy (08-07-2003)
Kommentar
Fra : Jimmy


Dato : 08-07-03 15:10

"Peter Lykkegaard" <polonline@hotmail.dk> skrev i en meddelelse
news:3f098f22$0$32486$edfadb0f@dread16.news.tele.dk...
>
> "Jimmy" <pleasereplyingroup@hotmail.com> wrote in message
> news:3f09891d$0$5171$edfadb0f@dread11.news.tele.dk...


> Brug GetRows...
> Du kan tjekke på størrelsen i dit array
>
> While I < UBound(feltArray)

Dem kendte jeg ikke...

> > Hvorfor går min kode 10 gange hurtigere (og det er en underdrivelse) når
> jeg
> > bruger løsning 2?
>
> Har du nogle tider
> Umiddelbart er det problemet med kald til field objectet der ligger et
> stykke nede i recordset hierarkiet

Ja, det er vel et minuts tid i forhold til måske højst 10 sekunder.

> > Jeg skal stadig igennem hele recordsættet, så for mig at se bruger jeg
> flere
> > instruktioner i Løsning 2.
>
> Erstat din løkke med GetRows - så vil det være endnu hurtigere

Noget lign.

if not rs.eof then
feltArray = rs.getrows()
end if

og så bare køre igennem med feltArray(i)

> Evt kombineret med et firehose (read-/forwardonly) recordset

Når jeg erklærer mit recordset samtidigt med executen er den så ikke read
only/forward only?
set rs = linkDB.Execute("select felt1...")

> > I mit hoved burde det betyde at løsning 2 var den
> > langsommeste. Det er den langt fra! Den eneste forskel jeg umiddelbart
kan
> > se er at jeg i stedet for at referere til rs("felt1") en masse gange nu
> kan
> > referere til feltArray(i), så et eller andet siger mig at det koster en
> > masse at referere til rs("felt1") (altså til recordsættet).
>
> Nej det er den manglende direkte reference til field objectet der er den
> største synder
> Det koster at lave opslag i et object hierarki

Ups, så når jeg kalder funktioner med rs("felt1") som parameter, så går den
hele hierarkiet igennem?
Vil rs.fields("felt1"), så cutte hele turen gennem objekt hierarkiet?

Ok, jeg summerer lige op her.

set rs = linkDB.Execute("Select felt1.....")
if not rs.EOF then
feltArray = rs.getrows()
end if
i = 0
while i < UBound(feltArray)
........feltArray(i) bliver jævnligt brugt i denne stump kode.
........
i = i + 1
wend

Ok, men hvad så med Select felt1, felt2...
Altså når der er mere end 1 felt?
Hmmm... Det kunne jeg selvfølgelig også lige prøve at lege mig frem til...

Youre the man...


Jimmy



Peter Lykkegaard (08-07-2003)
Kommentar
Fra : Peter Lykkegaard


Dato : 08-07-03 19:05


"Jimmy" <pleasereplyinnewsgroup@hotmail.com> wrote in message
news:3f0ad144$0$24702$edfadb0f@dread14.news.tele.dk...
> "Peter Lykkegaard" <polonline@hotmail.dk> skrev i en meddelelse
> news:3f098f22$0$32486$edfadb0f@dread16.news.tele.dk...
> >
> > Erstat din løkke med GetRows - så vil det være endnu hurtigere
>
> Noget lign.
>
> if not rs.eof then
> feltArray = rs.getrows()
> end if
>
Jeg har en svag mistanke til at du kan kalde den direkte uden tjek på EOF
Men det kan da være at den smider en runtime exception

> og så bare køre igennem med feltArray(i)
>
Jeps

> > Evt kombineret med et firehose (read-/forwardonly) recordset
>
> Når jeg erklærer mit recordset samtidigt med executen er den så ikke read
> only/forward only?
> set rs = linkDB.Execute("select felt1...")
>
Tjek med din documentation - skal jeg være ærlig så er det det jeg gør

>
> Ups, så når jeg kalder funktioner med rs("felt1") som parameter, så går
den
> hele hierarkiet igennem?
> Vil rs.fields("felt1"), så cutte hele turen gennem objekt hierarkiet?

det er lidt bedre men ikke meget
den rigtige syntaks er
rs.fields.item("felt").value

Men det bedste er at føre item objectet eller selve værdien over i en
variabel
>
> Ok, jeg summerer lige op her.
>
> set rs = linkDB.Execute("Select felt1.....")
> if not rs.EOF then
> feltArray = rs.getrows()
> end if
> i = 0
> while i < UBound(feltArray)
> ........feltArray(i) bliver jævnligt brugt i denne stump kode.
> ........
> i = i + 1
> wend
>
Jeps

> Ok, men hvad så med Select felt1, felt2...
> Altså når der er mere end 1 felt?

Du har et to dimensionelt array
feltArray(i, 1)
feltArray(i, 2)

> Hmmm... Det kunne jeg selvfølgelig også lige prøve at lege mig frem til...
>
Jada

> Youre the man...
>
thanks

mvh/Peter Lykkegaard



Søg
Reklame
Statistik
Spørgsmål : 177551
Tips : 31968
Nyheder : 719565
Indlæg : 6408825
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste