Alik Levin's

Clarity, Technology, and Solving Problems | PracticeThis.com

ASP.NET Data Binding Performance – Collection Is More Expensive Than Datatable

ASP.NET Data Binding Performance – Collection Is More Expensive Than Datatable

  • Comments 4
Alik Levin    In my previous post -  Best ASP.NET Performance Winner For Data Binding - Hands Up To Response.Write() – I’ve conducted several simple performance tests for data binding to GridView in ASP.NET page. What surprised me most is that eliminating massive loops and collection enumerations did not help in reducing CPU utilization. When we measured the execution times for both scenarios, DataBind() method revealed the secret.

Reporting Execution Times

We used System.Diagnostics.Trace to report execution times.

UseCustomCollection.aspx.cs

   1: System.Diagnostics.Trace.WriteLine("1. STARTING");
   2:  
   3: DataGrid datagrid = SampleServices.GenerateDynamicDataGridControl();
   4: this.Controls.Add(datagrid);
   5:  
   6: System.Diagnostics.Trace.WriteLine("2. GRID CREATED AND ADDED TO PAGE");
   7:  
   8: MyCollection myCollection = (MyCollection)SampleServices.GenerateCollection(200);
   9:  
  10: System.Diagnostics.Trace.WriteLine("3. CUSTOM COLLECTION CREATED");
  11:  
  12: datagrid.DataSource = myCollection;
  13: datagrid.DataBind();
  14:  
  15: System.Diagnostics.Trace.WriteLine("5. DONE");
 

UseDataTable.aspx.cs

   1: System.Diagnostics.Trace.WriteLine("1. STARTING");
   2:  
   3: DataGrid datagrid = SampleServices.GenerateDynamicDataGridControl();
   4: this.Controls.Add(datagrid);
   5:  
   6: System.Diagnostics.Trace.WriteLine("2. GRID CREATED AND ADDED TO PAGE");
   7:  
   8: MyCollection myCollection = (MyCollection)SampleServices.GenerateCollection(200);
   9:  
  10: System.Diagnostics.Trace.WriteLine("3. CUSTOM COLLECTION CREATED");
  11:  
  12: DataTable datatable = SampleServices.ConvertCollectionTableIntoDataTalbe(myCollection);
  13:  
  14: System.Diagnostics.Trace.WriteLine("4. CUSTOM COLLECTION CONVERTED INTO DATATABLE");
  15:  
  16: datagrid.DataSource = datatable;
  17: datagrid.DataBind();
  18:  
  19: System.Diagnostics.Trace.WriteLine("5. DONE");

 

Note, that UseCustomCollection.aspx.cs misses step “4. CUSTOM COLLECTION CONVERTED INTO DATATABLE”.

Collecting Execution Times

We used DebugView to collect reported execution times.

image 

Analysis

Applying simple mathematics we can see that converting Collection to Datatable takes 0.00081015 seconds.  This is the gain we get when skipping this step in UseCustomCollection.aspx.cs.

Now lets examine DataBind() in both cases:

  • UseCustomCollection.aspx.cs 0.00268023 seconds
  • UseDataTable.aspx.cs 0.00215912 seconds

I know it is not a huge improvement for binding datatable vs. collection, but the tests we conducted always showed this gap. That is why eliminating the type transformation from collection to datatable that included enumeration and looping did not really help and we ended up with similar results of ~65% CPU utilization:

UseDataTable.aspx UseCustomCollection.aspx
image ASP.NET Data Binding Performance

Conclusion

Binding custom collection is expensive performance wise since internally it uses reflection and reflection is expensive thing to do. Looping is expensive performance wise too but it is cheaper than reflection.

Related Materials

  • Hello Alik,

    If you casting DataItem in DataBound event and fill each line control (cells/labels), wouldn't you have a better performance?

    Regards,

  • Something is wrong on your own numbers:

    - the 1st one (customecollection) shows 0.0043

    - the 2nd one (datatable) shows 0.0047

    So the 2nd one is slower.

  • Hi, Israel!

    Interesting remark.

    Look at what PAG says about that:

    http://msdn.microsoft.com/en-us/library/ms998549.aspx

    look at "Minimize Calls to DataBinder.Eval" in it

    I guess I need to do more testing - thansk for calling this out!

  • Anatoly,

    Good catch! Please notice that in the post i measure how long does it take to DataBind() to complete and not the whole cycle as you call out. I must admit I was not that clear and this might have misled you. Sorry about that.

    The other stuff. My main goal - which is also not very clear in my post - to identify CPU killers and I am less interested in response times.

    Bottom line - you bring in interesting angle which adds to the whole picture, thank you for that

Page 1 of 1 (4 items)