Avatar billede lasserasch Juniormester
12. august 2009 - 02:54 Der er 11 kommentarer og
1 løsning

Langsom generering af output på min asp.net webside.

Hejsa.

Jeg er lidt et spørgsmålstegn overfor dette, så håber nogle har en ide til hvad der kan være galt.


Jeg har en stump kode som løber nogle klasser igennem. (artikler på et website). Den skal generere en liste over dem og præsentere listen som noget simpelt html.

Koden virker, men det er simpelthen så ekstrem langsomt. Det tager ca. 30 sekunder før .aspx siden er indlæst helt.

Jeg har lavet en meget simpel log funktion, for at finde ud af om det var min kode som genererer klasserne der var langsom eller om det var noget andet.

Min log skriver at listen List<> blev genereret på under 1 sekund, hvilket også er logisk, da den ligger i Cachen på serveren.

Hvorfor pokker tager det så så lang tid at generere html'en?

Hvis listen er lille. F.eks. 50 eller 100 rækker, så går det okay hurtigt (3 - 4 sekunder). Men hvis listen indeholder 1000 eller 1500 rækker så tager det op til de her ca. 30 sekunder.

Håber en kan pege mig i den rigtige retning.



Mvh.
Lasse




------------

DPF.Kernel.Debug.WriteToLog("Påbegyndt generering af HTML");
                     
                        foreach (DPF.Kernel.Data.Medlemsblad.Artikel a in Collection)
                        {
                           
                            html += "<tr><td><a href=\"" + a.Pdflink + "\" target=\"blank\">" + a.Overskrift + "</a></td><td> <b>(" + a.Teksttype + ")</b></td></tr>";
                            html += "<tr><td colspan=\"2\">" + a.Resume + "</td></tr>";
                            html += "<tr><td colspan=\"2\">Bladnr. <a href=\"" + url + "?param=blad&value=" + a.Bladid.ToString() + "\">" + RenderBladNavn(a) + "</td>";
                            html += "<tr><td colspan=\"2\">Kategori: " + RenderKategorier(a, url) + "</td></tr>";
                            html += "<tr><td colspan=\"2\">Artikel af: " + RenderForfattere(a, url) + "</td></tr>";
                            html += "<tr><td colspan=\"2\"><hr/></td></tr>";
                        }
                        DPF.Kernel.Debug.WriteToLog("Afsluttet generering af HTML");
                        html += "</table>";


                        lb_html.Text = html;

-----------



Her et udsnit af min log:
12-08-2009 02:36:24 - Påbegyndt Liste Generering
12-08-2009 02:36:24 - Afsluttet Liste Generering
12-08-2009 02:36:24 - Påbegyndt generering af HTML
12-08-2009 02:37:43 - Afsluttet generering af HTML


Hvis jeg fjerner alt vedr "HTML" strengen og heller ikke sætter værdien for min label til sidst, så loader min side i løbet af nul og nix, så det må være her jeg gør noget helt galt.....
Avatar billede Syska Mester
12. august 2009 - 04:06 #1
brug StringBuilder ...

http://channel9.msdn.com/forums/TechOff/14294-C-string-vs-StringBuilder/

Men ik' sikker det er løsningen, da jeg ikke kan se hvad det sidste er log over ...

// ouT
Avatar billede Syska Mester
12. august 2009 - 04:15 #2
Lille eksempel ...
            Stopwatch sw = new Stopwatch();

            sw.Start();
            string s = string.Empty;

            for (int i = 0; i < 30000; i++)
                s += i.ToString();
            sw.Stop();

            Console.WriteLine("Took: {0}", sw.Elapsed);


            sw = new Stopwatch();
            sw.Start();
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < 30000; i++)
                sb.Append(i.ToString());
            sw.Stop();

            Console.WriteLine("Took: {0}", sw.Elapsed);


Nu siger du 2500 artikler med endnu flere tegn end der er i mine små concatanering ... men her er tiden for begge:
Took: 00:00:02.5235622 - string
Took: 00:00:00.0072779 - StringBuilder
en faktor 346 i speed up ... det er jo nice nok :-)

Så måske det alligevel er en løsning for dig :-)
Avatar billede lasserasch Juniormester
12. august 2009 - 04:23 #3
Hmmmm, det var sgu da godt nok noget :-) Det vil jeg lige prøve... :-)
Avatar billede lasserasch Juniormester
12. august 2009 - 04:32 #4
Sådan der...

Nu kører det jo. Og endda super hurtigt... 2-3 sek tager siden om at loade nu. Det er jo lige til at holde ud :-)

Vidste godt at stringbuilder siges at være bedre end +=, men var sgu ikke klar over at der var så stor forskel.

Jeg er officielt en string builder mand nu :-)

Tak for hjælpen.

Smid svar for points...

Mvh.
Lasse
Avatar billede arne_v Ekspert
12. august 2009 - 04:38 #5
Noget helt andet: kunne den stringBUILDER konkanering ikke erstattes af en repeater?
Avatar billede lasserasch Juniormester
12. august 2009 - 05:11 #6
Jo måske. Men jeg ville meget gerne kunne styre nogle forskellige CSS klasser som der skal på de forskellige rækker alt efter hvilke data de indeholder osv...

Så alle rækkerne ser ikke ens ud html mæssigt nødvendigvis.


Og så har jeg nok en eller anden mani med at jeg godt kan lide at have et overblik over hvad output bliver direkte i min kode.

Jeg har godt nok aldrig brugt en repeater, men umiddelbart ligner den så mange andre kontroller som bruger en datasource.

Jeg synes ofte man mister overblikket og kommer til at brugere alt for lang tid på at få kontroller til at virke som man gerne vil.

Så vil jeg hellere skrive HTML'en i hånden selv :-)

Det er vel nok en smagssag vil jeg tro...



Mvh.
Lasse
Avatar billede arne_v Ekspert
12. august 2009 - 05:28 #7
Lige netop repeater giver dig større mulighed for selv at putte HTML kode ind.
Avatar billede ladyhawke Novice
12. august 2009 - 10:15 #8
En repeater har mulighed for at have forskelliget design på hver anden række, du kan designe en header og en footer. Og du har frit slag mht. layout for det enkelte element, der kan også udføres logik på elementernes data, så man f.eks. kan vælge forskellige CSS klasser mm.

StringBuilder er løsningen for alle større strengoperationer, færdig slut. Det er derfor man har udviklet den, altså at alm. streng konkatenering hvor man strengt taget laver et nyt array som passer til den nye længde, hver gang man tilføjer noget til strengen, er ALT for langsom, så snart der er mere end 10-20 operationer på en streng.
Avatar billede Syska Mester
12. august 2009 - 11:16 #9
og svar

// ouT
Avatar billede lasserasch Juniormester
12. august 2009 - 14:04 #10
Hmmm, ok. Så har jeg vist ikke helt styr på en repeater. Må jeg hellere få læst op på.


Uanset hvad, så var en string builder i hvert fald en ganske udemærket løsning for mig her....
:-)

Mvh.
Lasse
Avatar billede windcape Praktikant
13. august 2009 - 06:01 #11
> alm. streng konkatenering hvor man strengt taget laver et nyt
> array som passer til den nye længde, hver gang man tilføjer
> noget til strengen

Bare lige lidt flueknepperi for de teknik interasserede.

C# benytter pointer-magic til dens String class operationer, det er ikke bare et fornemt char-array.
Avatar billede Syska Mester
13. august 2009 - 14:33 #12
char ville vel give problemer, da en char er en byte ... eller hvordan løser de det ?

never the less ... SB er guden når man leger med stringe.

// ouT
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester