Come da alcuni miei post precedenti, questo e questo, mi trovo a dover confermare che i test che ho eseguito evidenziano come ASP.NET 2.0 sia estremamente meno performante della versione 1.1 nel DataBinding.
L'unico aggiornamento rispetto ai post precedenti è che ho realizzato una pagina ad hoc per ASP.NET 2.0 che utilizza la nuova sintassi per il late databinding, ossia sostituendo DataBinder.Eval con il comando Eval. In effetti la nuova sintassi porta qualche miglioramento rispetto a quella vecchia, ma tuttavia il risultato finale non è paragonabile alle prestazioni ottenute con ASP.NET 1.1.
Ecco un esempio di risultati degli ultimi test:
- DataBinding sotto ASP.NET 1.1
DataBinder: 304
StrongType: 250
Diff: 17,76316%
- DataBinding sotto ASP.NET 2.0 con sintassi specifica 2.0
DataBinder: 453
StrongType: 351
Diff: 22,51656%
I risultati dei test sono molto variabili, ma le differenze percentuali si attestano sempre attorno al 20% tra cast diretto e late binding, e comunque è sempre evidente il peggioramento con la versione 2.0.
Code-behind della pagina:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Web.Configuration;
public partial class _Default : System.Web.UI.Page
{
private string m_ConnectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
private DataSet ds;
protected void Page_Load(object sender, EventArgs e)
{
long startTicks;
long timeTakenTicks;
long[] timeArr = new long[2];
timeArr[0] = 0;
timeArr[1] = 0;
int cycles = 4;
BuildDataSet();
bool bindToggle = true;
DataGrid dg;
for(int i = 0; i < cycles; i++)
{
startTicks = Environment.TickCount;
if(bindToggle)
dg = DataBinderGrid;
else
dg = StrongTypeGrid;
for(int j = 0; j < 10; j++)
BindDataToGrid(dg, ds);
timeTakenTicks = Environment.TickCount - startTicks;
if(bindToggle)
timeArr[0] += timeTakenTicks;
else timeArr[1] += timeTakenTicks;
bindToggle = !bindToggle;
}
int time1 = (int)(timeArr[0]) / (cycles / 2);
Response.Write("DataBinder: " + time1.ToString() + "
");
int time2 = (int)(timeArr[1]) / (cycles / 2);
Response.Write("StrongType: " + time2.ToString() + "
");
long maxTime = Math.Max(time1, time2);
long minTime = Math.Min(time1, time2);
long diffInt = maxTime - minTime;
float percentDiff = ((float)diffInt * 100) / maxTime;
Response.Write("Diff: " + percentDiff.ToString() + "%");
}
private void BuildDataSet()
{
string sqlString = @"SELECT * FROM Orders";
SqlConnection conn = new SqlConnection(m_ConnectionString);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(sqlString, conn);
conn.Close();
ds = new DataSet();
da.Fill(ds);
}
private void BindDataToGrid(DataGrid grid, DataSet ds)
{
grid.DataSource = ds;
grid.DataBind();
}
}
Naturalmente non mi spiego questo comportamento, e l'unica cosa che mi viene da pensare è che forse per renderlo più performante bisognerebbe scrivere codice 100% .NET 2.0, ad esempio utilizzando SqlDataSource, ma in ogni caso non è giustificabile.
Come sempre, se qualcuno avesse qualche spiegazione da dare è il benvenuto.
powered by IMHO 1.3