如何提高ASP.NET MVC应用程序性能?
可能的改进来源的汇编清单如下:
一般
利用分析器发现应用程序中的内存泄漏和性能问题.我个人建议使用dotTrace
在生产中以及性能分析期间,在发布模式而非调试模式下运行站点.发布模式要快得多.调试模式可以隐藏您自己的代码中的性能问题.
高速缓存
使用CompiledQuery.Compile()
递归避免重新编译查询表达式
使用OutputCacheAttribute
以保存不必要和操作执行来缓存不易发生变化的内容
对于经常访问的非敏感信息,请使用Cookie
利用ETag和过期 - ActionResult
如有必要,编写自定义方法
考虑使用RouteName
组织路由然后使用它来生成链接,并尝试不使用基于表达式的ActionLink方法.
考虑实施路由解析缓存策略
把重复的代码放在你的内部PartialViews
,避免渲染它xxxx次:如果你最终在同一个视图中调用相同的部分300次,可能会出现问题.解释和基准
路由
使用Url.RouteUrl("User", new { username = "joeuser" })
指定的路线.Rudi Benkovic的ASP.NET MVC Perfomance
使用Rudi Benkovic的这个助手ASP.NET MVC Perfomance解析缓存路由UrlHelperCached
安全
使用表单身份验证,将经常访问的敏感数据保留在身份验证票证中
DAL
通过LINQ访问数据依赖于IQueryable
利用存储库模式
描述您的查询,即Uber Profiler
考虑您的查询的二级缓存,并为它们添加范围和超时,即NHibernate Second Cache
负载均衡
利用反向代理,在您的应用实例中传播客户端负载.(Stack Overflow使用HAProxy(MSDN).
使用异步控制器来实现依赖于外部资源处理的操作.
客户端
优化您的客户端,使用YSlow之类的工具来提高性能
使用AJAX更新UI的组件,尽可能避免整个页面更新.
考虑实现一个pub-sub架构-ie Comet-用于基于超时重新加载的内容交付.
如果可能,将图表和图形生成逻辑移动到客户端.图生成是一项昂贵的活动.将服务器从不必要的负担推迟到客户端,并允许您在本地处理图形而无需提出新请求(即Flex图表,jqbargraph,MoreJqueryCharts).
使用CDN的脚本和媒体内容来改善客户端的加载(即谷歌CDN)
缩小 - 编译 - 您的JavaScript以改善脚本大小
保持cookie大小,因为cookie会在每次请求时发送到服务器.
尽可能考虑使用DNS和链接预取.
全局配置
如果您使用Razor,请在global.asax.cs中添加以下代码,默认情况下,Asp.Net MVC使用aspx引擎和剃刀引擎进行渲染.这只使用RazorViewEngine.
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
在web.config中添加gzip(HTTP压缩)和静态缓存(images,css,...)
删除未使用的HTTP模块
在生成HTML(在web.config中)后立即刷新HTML,如果不使用它,则禁用viewstate
基本建议是遵循REST原则,以下几点将这些原理与ASP.NET MVC框架联系起来:
使您的控制器无状态 - 这更像是一个' Web性能/可扩展性'建议(与微/机器级性能相反)和一个会影响您的应用程序未来的主要设计决策 - 特别是在它变得流行或者您需要一些时容错例如.
不要使用Sessions
不要使用tempdata - 它使用会话
不要试图"过早地"缓存"一切".
使用表单身份验证
将经常访问的敏感数据保留在身份验证票证中
对于经常访问的非敏感信息,请使用Cookie
使您的资源可以在网络上 缓存
利用ETags
使用到期
如有必要,编写自定义ActionResult类
利用反向代理
编译你的JavaScript.还有Closure编译器库也可以这样做(确定还有其他的,只是搜索'JavaScript编译器')
使用CDN(内容分发网络) - 尤其适用于大型媒体文件等.
考虑数据的不同类型的存储,例如,文件,键/值存储等 - 不仅仅是SQL Server
最后但同样重要的是,测试您的网站的性能
Code Climber和此博客条目提供了提高应用程序性能的详细方法.
编译查询将提高应用程序的性能,但它与ASP.NET MVC没有任何共同之处.它将加速每个数据库应用程序,因此它不是真正关于MVC.
这看起来很明显,但在生产模式和性能分析期间,您可以在发布模式下运行站点,而不是在调试模式下运行.发布模式要快得多.调试模式可以隐藏您自己的代码中的性能问题.
这不是一个惊天动地的优化,但我想我会把它扔出去 - 使用CDN用于jQuery等.
来自ScottGu本人的引用:Microsoft Ajax CDN使您能够显着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗体和ASP.NET MVC应用程序的性能.该服务免费提供,无需任何注册,可用于商业和非商业目的.
我们甚至将CDN用于使用jQuery的Moss中的webparts.
通过LINQ访问数据依赖于IQueryable ...
为什么使用AsQueryable()而不是List()?
...并获得良好的存储库模式:
在存储库模式中加载子记录
这将优化数据访问,以确保仅加载所需数据,并且仅在需要时加载.
此外,如果您使用NHibernate,您可以打开并为查询设置二级缓存并添加到查询范围和超时.EF,L2S和NHibernate 还有kick ass profiler - http://hibernatingrhinos.com/products/UberProf.它将有助于调整您的查询.
我还要补充一下:
使用Sprite:Sprites是减少请求的好东西.您将所有图像合并为一个图像并使用CSS来获取精灵的大部分内容.Microsoft提供了一个很好的库来实现它: Sprite和Image Optimization Preview 4.
缓存您的服务器对象:如果您有一些很少更改的引用列表或数据,您可以将它们缓存到内存中,而不是每次都查询数据库.
使用ADO.NET而不是Entity Framework:EF4 or EF5
非常适合减少开发时间,但优化会很痛苦.优化存储过程比实体框架更简单.所以你应该尽可能地使用商店程序.Dapper提供了一种查询和映射SQL的简单方法,具有非常好的性能.
缓存页面或部分页面:MVC根据一些参数为缓存页面提供了一些简单的过滤器,因此请使用它.
减少数据库调用:您可以创建一个返回多个对象的唯一数据库请求.查看Dapper网站.
始终拥有一个干净的架构:即使在一个小项目上,也要拥有干净的n层架构.它将帮助您保持代码清洁,并在需要时更容易优化它.
您可以查看此模板" Neos-SDI MVC模板 ",它将为您创建一个干净的体系结构,默认情况下会有很多性能改进(请查看MvcTemplate 网站).