Last few days, I was working on performance improvement of one of my Web Applications. I analysed my application in various ways. Also used different profiler and did profiling for my application using several profilers like Ants, .NET profiler etc. During analysis, I found few problems, that we rectified but got no visible improvement.
Later I thought, my server side code is good enough, but still its taking time to download the page. Although we are already using IIS compression to reduce the page size, but still Page was taking good amount of time to download.
I posted a blog to enable IIS compression, Click the following link to have a look
How to enable HTTPCompression at IIS6
Actually, My application is RIA application and we are using myriad ajaxtoolkit controls in our application. I analysed my application using firebug and there are a lot of scriptresource.axd and webresource.axd files are gettng downloaded.
So I thought if we can combine these files into single that will a great performance application boost for our application.
First, I tried doing it from myself, Later I found ASP.NET itself provides a way to combine these axd files. Just you need to have .NET 3.5 SP1.
So if you are using framework version 3.5 upgrade it to SP1 and enjoy this feature.
I have created a small sample and will show you with the help of it.
So In my sample application, I have a Calender extender. Lets see how many requests are there using firebug.
We can see currently there are 14 requests on every PageLoad. We can reduce the number of request.
So to use this, first you need to download a ScriptReferenceProfiler. You can download it from here.
Now add the reference in your project and add the profile in the your page.
First register it as
<%@ Register Assembly="ScriptReferenceProfiler" Namespace="ScriptReferenceProfiler" TagPrefix="cc2" %>
and add it as a control like
<cc2:ScriptReferenceProfiler ID="ScriptReferenceProfiler1" runat="server" > </cc2:ScriptReferenceProfiler>
Now when you run you application you will see the page as
Now copy all the link and put it in the CompositSctript tag as
<asp:ScriptManager ID="ScriptManager1" runat="server"> <CompositeScript> <Scripts> <asp:ScriptReference name="MicrosoftAjax.js"/> <asp:ScriptReference name="MicrosoftAjaxWebForms.js"/> <asp:ScriptReference name="AjaxControlToolkit.Common.Common.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Common.DateTime.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Compat.Timer.Timer.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Animation.Animations.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.ExtenderBase.BaseScripts.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Animation.AnimationBehavior.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.PopupExtender.PopupBehavior.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Common.Threading.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Calendar.CalendarBehavior.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> </Scripts> </CompositeScript> </asp:ScriptManager>
Now lets run the Application. Lets check the firebug.
Here we can see the number of significantly reduced It’s just 4.
But this is sample and its working fine. But when you try to your actual application you might face several issues.
One issue that I faced while using with my Live application and That is
Issue: The resource URL cannot be longer than 1024 characters. If using a CompositeScriptReference, reduce the number of ScriptReferences it contains, or combine them into a single static file and set the Path property to the location of it.
So first I could not understand it and try to find to something on google. But somewhere found it’s a issue and it will be taken care or handle by own for the time being. But during analysis I found one solution.
The problem is the URL length is getting higher than 1024. So for this one has to reduce the number of files getting combined. So you can have more than one group of file and put it in different composit scripts tag.
I have added one script manager proxy and added a compositscript tag it in it and pasted almost half of the scripts in it. And it resoved the issue. As
<asp:ScriptManager ID="ScriptManager1" runat="server"> <CompositeScript> <Scripts> <asp:ScriptReference name="MicrosoftAjax.js"/> <asp:ScriptReference name="MicrosoftAjaxWebForms.js"/> <asp:ScriptReference name="AjaxControlToolkit.Common.Common.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Common.DateTime.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Compat.Timer.Timer.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> </Scripts> </CompositeScript> </asp:ScriptManager> <asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"> <CompositeScript> <Scripts> <asp:ScriptReference name="AjaxControlToolkit.Animation.Animations.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.ExtenderBase.BaseScripts.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Animation.AnimationBehavior.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.PopupExtender.PopupBehavior.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Common.Threading.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> <asp:ScriptReference name="AjaxControlToolkit.Calendar.CalendarBehavior.js" assembly="AjaxControlToolkit, Version=3.0.30930.28736, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"/> </Scripts> </CompositeScript> </asp:ScriptManagerProxy>
Now it will combine the resource files in two files. You can add more CompositScript tags if required.
Hope all you have enjoyed this and get benefited from it.
Cheers,
Brij
Cool strategy. Same as you, even with IIS compression we still suffer from long load times, so I’m eager to try your solution!
Sure!! Try this one. You will find that your application bit faster
Hey Brij!
1st of all I am much surprised that you only done a lot…are you a man or a robot??
But I personally want to ask that if I want to ask something another software or something another software related questions then will you guide me???
Thanks for your feedback.
Many people do a lot of community work and mine is negligible if I compare.
I’ll surely glad if I can do something fruitful for you. You can contact me here or mail me at my Id : brij_mishra2003@yahoo.co.in
Yp sime you are right!
Brij is really very genius man…. 🙂
Thanks a lot
If we follow some techniques we can improve our ASP.NET Application Performance. Some of them are…
Reduce ASP.NET page size
Avoid view state
Use div instead of table
Avoid big name for asp.net server control and CSS class tag
Remove unnecessary white space and CSS
Reduce number of HTTP request
Try to use minimum number of image & consider their size
Combine two ore CSS & JavaScript file into one
Use efficient cashing strategies
Set debug=false in web.config
Avoid Response.Redirect
Use the String builder to concatenate string
Avoid throwing exceptions
Use Finally Method to kill resources
Use Client Side Scripts for validations
for more: http://cybarlab.blogspot.com/2013/02/aspnet-application-performance.html
Yeah.. You have listed down all most important common points that should be taken care while working on application or analyzing it. What I have written in my blog that after analyzing the application, I used this one more way to improve the performance significantly. The way discussed in the blog is neither complete nor the only way to improve the performance.
Compression, Caching and CDN are really great ways. Thanks for sharing. I had collected some parameters which we should be targeting to optimize. Have a look and let me know.