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.
- C# e Net 6 in Kubernetes con Prometheus e Grafana, il 12 gennaio 2022 alle 21:58
- Snaturare Kubernetes evitando i custom container Docker, il 6 gennaio 2022 alle 19:40
- Provando Kaniko in Kubernetes come alternativa a Docker per la creazione di immagini, il 18 dicembre 2021 alle 20:11
- Divertissement con l'OpenID e Access Token, il 6 dicembre 2021 alle 20:05
- Operator per Kubernetes in C# e Net Core 6., il 28 novembre 2021 alle 19:44
- RBAC in Kubernetes verso gli operator, il 21 novembre 2021 alle 20:52