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.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Kubernetes, gRPC e service mesh, il 28 dicembre 2020 alle 21:43
- Game of life in Angular.js, il 29 marzo 2016 alle 18:47
- ASP.NET e RabbitMQ (con un po' di Node.js), il 18 marzo 2016 alle 19:41
- Divide et impera con c# e un message broker, il 9 marzo 2016 alle 20:43
- Button con disabilitazione dello stesso dopo il click, il 5 luglio 2009 alle 15:00
- Triplet class non è un oggetto curioso, è utilissimo!!!, il 12 settembre 2008 alle 13:11