A volte ritornano... GridView vs Repeater vs ListView vs Custom
di Andrea Zani, in .NET, martedì 26 agosto 2008 ore 09.20
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.
Nella stessa categoria
Triplet class non è un oggetto curioso, è utilissimo!!!
Entity Framework e stranezze(*)
Entity Framework. Una tabella due Entity senza discriminazioni
Entity Framework e più tabelle in una entity
L'Entity Framework e le custom class coinvolte nei where...
Entity Framework e l'ereditarietà (Single Table Inheritance)
I più letti del mese



















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.