Ancora prestazioni: Datagrid vs Datalist vs Repeater vs ...

di Andrea Zani, in .NET,

Poco fa leggevo un post in un newsgroup sulle differenze tra i webcontrol DataList e Repeater. Naturalmente la vittoria è andata al Repeater, e visto che ero in vena ho fatto dei test di confronto per le prestazioni da questi webcontrol aggiungendo anche il DataGrid.

Per fare i test ho scritto delle semplici pagine in asp.net che effettuano una query ad un database che ritorna 100 record con 14 campi, e questi vengono visualizzati nella pagina web esattamente in 5 modi:

  1. DataGrid con la generazione automatica delle colonne.
  2. DataGrid con l'inserimento manuale delle colonne da codice.
  3. DataList
  4. Repeater
  5. Custom (merita una trattazione a sé).

Il codice per il popolamento di questi webcontrol (tranne l'ultimo) è il seguente:

Sub Page_Load
        Dim str_conn As String = "..."
        Dim conn As New OleDbConnection(str_conn)
        Dim command As New OleDbCommand("select * from tabella", conn)
        conn.Open()
        <em>webcontrol</em>.DataSource = command.ExecuteReader(CommandBehavior.CloseConnection)
        <em>webcontrol</em>.DataBind()
End Sub

Ok, vediamo i risultati:

  • DataGrid1: 0,0892 s
  • DataGrid2: 0,0671 s
  • DataList: 0,0071 s
  • Repeater: 0,0060 s

C'è bisogno di fare commenti? Il Datagrid viene stracciato dal Datalist e dal Repeater e confina l'uso di questo webcontrol a casi particolari o ad webapplication per intranet. La differenza di un centesimo di secondo tra il DataList e il Repeater è quasi insignificante e promuove a quasi pieni voti il datalist viste le comodità che permette come le modalità di selezione e di incolonnamento davvero molto comode. Il Repeater? Una garanzia! :D

Ho tralasciato il quinto metodo, il custom. L'ho chiamato così perché non viene utilizzato nessun webcontrol, ma viene creata la tabella in HTML in un buffer interno (ho utilizzato lo StringBuilder per le prestazioni) leggendo i dati uno a uno dal datareader. Ecco il codice:

Sub Page_Load()
        Dim str_conn As String = "..."
        Dim conn As New OleDbConnection(str_conn)
        Dim command As New OleDbCommand("select top 100 * from tutte", conn)
        conn.Open()
        Dim dr As OleDbDataReader = command.ExecuteReader()
        Dim risultato As New StringBuilder
        risultato.Append("<table border='1px' width='100%'>")
        While (dr.Read())
            risultato.Append("<tr>")
            risultato.Append("<td>")
            risultato.Append(dr(0).ToString())
            risultato.Append("</td>")
            ...
            risultato.Append("<td>")
            risultato.Append(dr(13).ToString())
            risultato.Append("</td>")
            risultato.Append("</tr>")
        End While
        risultato.Append("</table>")
        Label1.Text = risultato.ToString()
        dr.Close()
        conn.Close()
End Sub

Le prestazioni? 0,0023 s. Tre volte più veloce del Repeater e una trentina di volte più veloce del DataGrid. Stupisce questo dato? Neanche minimamente. I Webcontrol come il DataGrid, DataList e Repeater sono stati creati per visualizzare i dati provienente da qualsiasi fonte e con la massima personalizzazione possibile per il programmatore che li utilizza, quindi con codice ben lontano dall'ottimizzazione esposta nel codice scritto qui sopra che ha, di conseguenza, lo svantaggio di essere personalizzabile solo mettendo mano al codice. 

Ah, naturalmente i test comparativi non devono aver valore assoluto... Certe volte è bello cominciare il pomeriggio con il Jazz che ti accarezza le orecchie...

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