You've built an ASP.NET MVC application, but now you want it to go faster and serve more concurrent user requests. In this session, we'll look at some of the common performance problems ASP.NET MVC applications may encounter, and how to diagnose and correct them, using Visual Studio 2010's testing tools.
Presented 8 Feb 2010 at MVCConf.com.
3. Defining Performance
Requirements
• A given web request (/Home/Index)
• Must return within a given time (TTLB or
Page Execution Time)
• Under a given load (Requests/Sec + Active
Users)
• Given system characteristics (50k records)
• Resource constraints (< 400 database
server requests/sec)
www.mvcConf.com
4. Performance Requirement
• /Home/Index
• Must return within 1s Page Execution
Time
• Given 100 request/sec and base database
• With < 200 database requests/sec
www.mvcConf.com
5. Measure Baseline
• Record the Scenario
• Set up the Load Test
• Run the Test
• Analyze the Results
www.mvcConf.com
9. Tuning a Web Application
Define Goal
Meets Goal
Measure System Stop
Does Not Meet Goal
Form Hypothesis;
Change Only One Thing!
Alter System
www.mvcConf.com
10. Most Common Performance
Problems
• Database
– Too many queries
– Queries Not Optimized
• Network Requests
– From Server to Services
– From Browser to Web Server
www.mvcConf.com
11. Simple but Important
• Be sure production DLLs are compiled in Release mode!
• Isis.CodePlex.com (still alpha)
www.mvcConf.com
12. Caching
• Output Caching
– [OutputCache] attribute
– Applies to
• Action methods within Controller
• Or Entire Controller
www.mvcConf.com
16. Add Data Caching
• Apply to Read operations
• Use where Output Caching can’t be used
• Consider applying at Repository level
• Consider using Sql Cache Invalidation or
short cache duration
www.mvcConf.com
17. What About Writes?
• Avoid blocking on writes
– Send messages
– Use Async calls on server
– Use Async/Ajax calls from client
• Logically partition reads and writes
– Command Query Responsibility Separation
(CQRS)
www.mvcConf.com
22. MVC 3 Performance
• Unobtrusive client-side validation on by default
• Razor view engine imposes small cost over
webforms view engine
• Performance improved for:
– Expression caching (lambdas)
– URL generation
– Action lookup
– Filter invocation
www.mvcConf.com
23. MVC Gotchas
• Avoid HttpResponse.WriteSubstitution()
– Contents may be incorrectly cached
– http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx
– May work with MVC3 + ASPX; not supported; definitely not w/Razor
• RenderAction() Cache Bug
– Calling an action with OutputCache attribute may
result in entire page being cached
– http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx
www.mvcConf.com
24. MVC Performance Tips
Disable Unused View Engines
• Html.EditorFor, Html.DisplayFor always
look for templates for each view engine
• Save extra “misses” to disk by removing
unused view engines.
www.mvcConf.com
26. MVC Performance Tips
Avoid Passing Null to Strongly Typed Views
w/Helpers
• Helpers like Html.TextBoxFor(m =>
m.Name) will throw
NullReferenceException
• Exceptions will be caught/ignored, but may
add up to negative performance impact
www.mvcConf.com
28. MVC Performance Tips
Uninstall IIS UrlRewrite Module
• If no applications on the server are using
it
• No effect in MVC apps before v3
• Enhances speed of URL generation
www.mvcConf.com
31. Summary of Perf Gains
300
250
200 Base
Release Mode
150
No Null ViewModel
100
1 ViewEngine
50 OutputCache
0
Pages/Sec Page Time (ms)
www.mvcConf.com
32. Summary
• Set Goals – Don’t Optimize Prematurely
• Measure and Tune Scientifically
• Look for big wins first
• Watch out for Gotchas and apply Tips
www.mvcConf.com
34. Questions?
Tweet Your Questions to:
@ardalis How do I…? #mvcconf
Steve Smith
ssmith@lakequincy.com
SteveSmithBlog.com
Twitter: @ardalis
www.mvcConf.com