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

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()
webcontrol.DataSource = command.ExecuteReader(CommandBehavior.CloseConnection)
webcontrol.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...

Nella stessa categoria

Commenti

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - AZ - Il blog di Andrea Zani

TagCloud
BLOG INFO
  • Post: 257
  • Commenti: 160
  • TrackBacks: 34
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML

MVP
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA