Repeater och dess prestanda

När man jobbar med asp.net och datamängder är det enkelt att använda repeaterkontrollen.

Repeatern använder reflection internt. Utöver det skapar den en ny kontroll för varje informationstyp du skapar i din itemtemplate. Som exempel kan vi ta en enkel listning av namn, ett namn per rad.

<asp :Repeater ID="rptTest" runat="server" onitemdatabound="rptTest_ItemDataBound">
    <itemtemplate>
        Namn: <asp :Literal ID="litName" runat="server"></asp><br />
    </itemtemplate>
</asp>

Vi får då ett kontrollträd som ser ut såhär (för två poster):

rptTest System.Web.UI.WebControls.Repeater
	rptTest$ctl00 System.Web.UI.WebControls.RepeaterItem
		rptTest$ctl00$ctl00 System.Web.UI.LiteralControl
		rptTest$ctl00$litName System.Web.UI.WebControls.Literal
		rptTest$ctl00$ctl01 System.Web.UI.LiteralControl
	rptTest$ctl01 System.Web.UI.WebControls.RepeaterItem
		rptTest$ctl01$ctl00 System.Web.UI.LiteralControl
		rptTest$ctl01$litName System.Web.UI.WebControls.Literal
		rptTest$ctl01$ctl01 System.Web.UI.LiteralControl

Tid att rendera sidan: 0,00118 ms

Lägg märke till att det skapas tre literals för varje repeateritemkontroll.

Den första literalen skapas för vår ”Namn”-text. Den andra har vi valt själva. Den tredje skapas för vår <br>-tagg. Detta betyder att vi i vårt fall skapar 4*n kontroller, där n är antal poster i vår kollektion.

Om vi istället använder vanlig iteration så får vi inget utökat kontrollträd alls. Istället skrivs texten ut i en befintlig kontroll som heter System.Web.UI.HtmlControls.HtmlForm.

< %
foreach (string name in names)
{
    Response.Write("Namn: ");
    Response.Write(name);
    Response.Write("<BR />");
}
%>

Tid att rendera sidan: 0,00064.

Lägg märke till att vi även vid denna extremt enkla typ av rendering får noterbar prestandaförbättring utan repeatern.

Förutom den mätbara skillnaden i tid så kommer garbage collectorn behöva jobba mer, vilket tar processorkraft och minne. Detta gör att vi med repeatern kommer att få mycket lägre max requests/sec.

Det finns förmodligen ingen anledning att helt sluta använda repeatern. Men i de fall där det listas många poster eller om det är en repeater som visas på många sidor (exempelvis en meny) så kan det vara bra att fundera över att istället använda Response.Write direkt i koden.

Det kan dock vara bra att skapa en egen kontroll för dessa tillfällen, så du slipper <%= %> i ditt ramverk.

Utöver det så kan man använda output cache på repeatern och då skapas också bara en kontroll och bra prestanda kan uppnås.

1 kommentar

  1. […] maj 2009 vid 06:57 · Arkiverad under Asp.net, MVC, Prestanda Jag har redan skrivit om repeatern och dess prestanda när man använder webforms. När man jobbar med MVC så skall man inte jobba med färdiga […]

RSS feed for comments on this post

Kommentarer inaktiverade.

%d bloggare gillar detta: