Har en konstig fråga kanske, men vill bara veta! Stringbuilder skall du undvika, det finns bättre sätt att bygga tabellverk på. Datagrid och list är kanoners om man skall göra snabba jobb, men skall man ha lite mer detaljer som exempelvis forumet, då bygger man upp det med code-behind (Dim tr as new tablerow). Vet inte om detta är en rättvis kontroll, men jag skrev en simpel funktion för att se hur lång tid det tog att skapa x antal rader i en tabel. Ja, egentligen skall väl dimentionering av rad och cell ligga i for-loopen så det lär gå ännu långsammare där. Sen tror jag faktiskt att det som händer i bakgrunden är densamma, det är egentligen en stringbuilder som byggs. Sen att det är 300000 rader, det skall vara osagt hur många html-sidor som har det. Det är väl inte så ofta som du sprutar ut 300 000 tabellrader (hoppas jag.. ?) Enda anledningen till att jag tog just 300 000 rader i tabellen var att jag ville få fram en tidsskilnad, givetvis kan man inte skriva HTML-koden för detta till klienten eftersom det skulle blir flera Mb data.Funderingar kring ASP.NET WebControls
Finns det någon fördel, annan än att det blir överskådligt, att använda DataGrid, DataList och Repeater som finns inbyggt i .NET?
Blir det långsammare att själv loppa igenom en DataReader och bygga upp en tabell med en StringBuilder och sedan skriva denna till en Label?
Tänkte mest på att man i en Repeater måste skriva såhär:
<code>
<%# DataBinder.Eval(Container.DataItem, "Description") %>
</code>
för att binda en column. Kan detta verkligen kompileras in i DLL-filen som blir när man bygger projektet eller måste det kompileras i runtime varje gång sidan besöks?Sv: Funderingar kring ASP.NET WebControls
Dock skiljer sig serverkontroller från annat du gör, de anpasas även för den typ av webbläsare som frågar, så därför skall du oftast få html-kod som är bäst lämpad för läsaren utan att behöva tänka på det vilket är en stor fördel.
All kod som finns oavsett om det ligger som inline eller som codebehind kompileras och därmed går snabbare än vad klassisk asp gjorde.
Något du däremot inte nämnt är ju cachning också. Detta kan du dels göra på en aspxsida eller en usercontrol. Det gör att de objekt som finns på sidan inte läser i databasen hela tiden utan regleras av dig som programmerare. Då går det oerhört fort.Sv:Funderingar kring ASP.NET WebControls
Koden är såhär:
<code>
Sub TestaAspTable()
Dim StartTime As Date = Now
Dim EndTime As Date
Dim i As Integer = 0
Dim table As New System.Web.UI.WebControls.Table
Dim r As New System.Web.UI.WebControls.TableRow
Dim c As New System.Web.UI.WebControls.TableCell
With table
For i = 0 To 300000
r = New System.Web.UI.WebControls.TableRow
c = New System.Web.UI.WebControls.TableCell
c.Text = "Some text"
r.Cells.Add(c)
.Rows.Add(r)
Next
End With
EndTime = Now
Response.Write("Table: " & StartTime.Second & ":" & StartTime.Millisecond & " -> " & EndTime.Second & ":" & EndTime.Millisecond & "<br>")
End Sub
Sub TestStringBuilder()
Dim StartTime As Date = Now
Dim EndTime As Date
Dim SB As New System.Text.StringBuilder(1000000)
Dim i As Integer = 0
With SB
SB.Append("<TABLE border=0>")
For i = 0 To 300000
SB.Append("<TR>")
SB.Append("<TD>Some text</TD>")
SB.Append("</TR>")
Next
.Append("</table>")
End With
EndTime = Now
Response.Write("SB: " & StartTime.Second & ":" & StartTime.Millisecond & " -> " & EndTime.Second & ":" & EndTime.Millisecond & "<br>")
End Sub
</code>
Resultatet av detta blir:
Table: 2:207 -> 3:739
SB: 3:739 -> 3:848
Dvs. AspTable tar 1.5 sekunder för att göra detta, medans StringBuilder tar 0,15 sekunder. Tio gånger så snabbt som tabellen med andra ord.
Kommentarer kring detta? :)Sv: Funderingar kring ASP.NET WebControls
Däremot är det bättre kodning med exempel 1 för då ser man hur det är gjort på ett annat sätt och mindre risk med att man strular till sina egna taggar.
Men prestanda, ja då är det ju uppenbarligen stringbuider som vinner. Sen är nästa fråga om det spelar någon roll när koden väl är körd en första gång då den är cachad.Sv:Funderingar kring ASP.NET WebControls
Det är ju mycket enklare att modifiera koden och utseendet med server controls som t.ex datagrid.
Ofta kanske du ska ut med 50 rader och då är skillnaden försumbar.
Koden för att bygga upp tabeller med Stringbuilder blir ofta väldigt snårig och svår att ändra.
Man ska väga prestandanknep mot hur bra koden blir och ur lätt det blir att ändra.
Som gammal VB-kodare har man i ryggmärgen att det är dyrt att skapa nya objekt. Det var dyrt med VB6 men nu är det inte lika dyrt längre!Sv: Funderingar kring ASP.NET WebControls
vad jag ville ha fram av detta inlägget var helt enkelt om det är långsammare att skriva grid:arna själv, eftersom jag gör det på en del ställen i en prestandakrävande applikation.
//Tom