A volte ritornano... GridView vs Repeater vs ListView vs Custom

di Andrea Zani, in .NET,

Sono passati anni? Parecchio tempo fa avevo confrontato le prestazioni nel binding dei dati tra i più noti webcontrol. Ecco un refresh, questa volta con il Framework 3.5 e con lo scontro tra:

  • Gridview
  • Repeater
  • ListView
  • Custom code

Chiunque un po' smaliziato con il .net saprà già chi vince e chi è il peggiore tra questi. Ma per i novizi è sempre meglio saperlo. Innanzitutto, il codice per il popolamento delle tabelle html è il seguente:

List<Person> p;
p = new List<Person>(200);
for (int i = 0; i < 200; i++)
  p.Add(new Person { Id=i, Age=i, Description="Desc "+i.ToString(), Name="Name "+i.ToString() });

Il gridview crea la table html con questo codice:

<asp:GridView ID="gw1" EnableViewState="false" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="id" />
        <asp:BoundField DataField="name" />
        <asp:BoundField DataField="age" />
        <asp:BoundField DataField="description" />
    </Columns>
</asp:GridView>

Per il repeater abbiamo:

<asp:Repeater ID="rp1" runat="server" EnableViewState="false">
<HeaderTemplate><table border="1"></HeaderTemplate>
<FooterTemplate></table></FooterTemplate>
<ItemTemplate>
<tr>
    <td><%# Eval("id") %></td>
    <td><%# Eval("name") %></td>
    <td><%# Eval("age") %></td>
    <td><%# Eval("description") %></td>
</tr>
</ItemTemplate>
</asp:Repeater>

Ma siccome vogliamo ottimizzare un po', possiamo scrivere:

<tr>
    <td><%# ((Person)Container.DataItem).Id %></td>
    <td><%# ((Person)Container.DataItem).Name %></td>
    <td><%# ((Person)Container.DataItem).Age %></td>
    <td><%# ((Person)Container.DataItem).Description %></td>
</tr>

Ecco il ListView, semplice:

<asp:ListView ID="lw1" runat="server" EnableViewState="false">
    <LayoutTemplate>
        <table border="1">
            <asp:Panel ID="itemPlaceholder" runat="server" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td><%# Eval("id") %></td>
            <td><%# Eval("name") %></td>
            <td><%# Eval("age") %></td>
            <td><%# Eval("description") %></td>
        </tr>
    </ItemTemplate>
</asp:ListView>
 

E ottimizzato:

<ItemTemplate>
    <tr>
        <td><%# ((Person)Container.DataItem).Id %></td>
        <td><%# ((Person)Container.DataItem).Name %></td>
        <td><%# ((Person)Container.DataItem).Age %></td>
        <td><%# ((Person)Container.DataItem).Description %></td>
    </tr>
</ItemTemplate>

E infine creiamo la griglia da codice con un banale StringBuilder da codice:

var sb = new StringBuilder(10000);
sb.Append("<table border='1'>");
for (int i = 0; i < p.Count; i++)
{
    sb.Append("<tr><td>");
    sb.Append(p[i].Id);
    sb.Append("</td><td>");
    sb.Append(p[i].Name);
    sb.Append("</td><td>");
    sb.Append(p[i].Age);
    sb.Append("</td><td>");
    sb.Append(p[i].Description);
    sb.Append("</td></tr>");
}
sb.Append("</table>");
pn1.Controls.Add(new LiteralControl(sb.ToString()));

pn1 è un panel. Ma vediamo le prestazioni (medie):

GridView 0.122s
Repeater 0.058s
Repeater ottimizzato 0.046s
ListView 0.059s
ListView ottimizzato 0.047s
Custom code 0.006s

A parte la tabella scritta con lo StringBuilder che mediamente risulta otto volte più veloce del ListView e del Repeater, la sorpresa è proprio il ListView che risulta veloce quanto il Repeater. In poche parole? Il DataGrid, DataList, DataGrid e Repeater sono diventati obsoleti e inutili dato il ListView non solo sostituisce in tutto questi webcontrol, ma ha prestazioni più che buone.  

Inoltre, per avere un discreto guadagno, anche la visualizzazione con il casting di tipo nella colonna, invece dell'Eval, è consigliato.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese