我如何提高ASP.NET MVC应用程序的性能?
你如何提高你的ASP.NET MVC应用程序性能?
可能的改进来源列表如下:
一般
- 利用分析器来发现应用程序中的内存泄漏和性能问题。 我个人build议dotTrace
- 在发布模式下运行您的站点,而不是在debugging模式下,在生产环境中以及性能分析过程中。 发布模式要快得多。 debugging模式可以隐藏自己的代码中的性能问题。
高速caching
- 使用
CompiledQuery.Compile()
recursion地避免重新编译查询expression式 - 使用
OutputCacheAttribute
caching不容易更改的内容,以节省不必要的操作和执行操作 - 对经常访问的非敏感信息使用Cookie
- 使用ETags和过期 – 如果需要,编写自定义的
ActionResult
方法 - 考虑使用
RouteName
组织您的路线,然后使用它来生成您的链接,并尽量不使用基于expression式树的ActionLink方法。 - 考虑实施路线parsingcaching策略
- 把重复的代码放在你的
PartialViews
,避免渲染它xxxx次:如果你最终在同一个视图中调用相同的部分300次,可能是有问题的。 解释和基准
路由
-
使用
Url.RouteUrl("User", new { username = "joeuser" })
来指定路由。 ASP.NET MVC Perfomance作者:Rudi Benkovic -
高速caching路由使用此帮助程序
UrlHelperCached
ASP.NET MVC Perfomance由Rudi Benkovicparsing
安全
- 使用表单身份validation,将经常访问的敏感数据保存在身份validation票证中
DAL
- 当通过LINQ访问数据时依靠IQueryable
- 利用知识库模式
- 描述您的查询,即Uber Profiler
- 考虑二级caching为您的查询,并添加一个范围和一个超时,即NHibernate的第二caching
负载均衡
-
利用反向代理,将客户端负载分散到您的应用程序实例中。 (堆栈溢出使用HAProxy ( MSDN )。
-
使用asynchronous控制器来实现依赖外部资源处理的操作。
客户端
- 优化你的客户端,使用像YSlow这样的工具来提高性能
- 使用AJAX更新UI的组件,尽可能避免整个页面更新。
- 考虑实施一个pub-sub体系结构-ie Comet-内容交付,以防止基于超时的重新加载。
- 如果可能,将图表和图表生成逻辑移动到客户端。 graphics生成是一个昂贵的活动。 将服务器推迟到客户端,避免不必要的负担,并允许您在本地使用graphics,而无需提出新的请求( 例如 ,Flex图表, jqbargraph , MoreJqueryCharts )。
- 使用CDN的脚本和媒体内容来改善客户端的加载(即Google CDN )
- Minify – 编译 – 您的JavaScript,以改善您的脚本大小
- 保持cookie大小很小,因为cookie会在每个请求中发送到服务器。
- 考虑在可能的情况下使用DNS和链接预取 。
全局configuration
-
如果您使用Razor,请在global.asax.cs中添加以下代码,默认情况下,Asp.Net MVC会使用aspx引擎和razor引擎进行渲染。 这只使用RazorViewEngine。
ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());
-
在web.config中添加gzip(HTTP压缩)和静态caching(images,css,…)
<system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>
- 删除未使用的HTTP模块
- 刷新你的HTML一旦生成(在你的web.config),并禁用视图状态,如果你不使用它
<pages buffer="true" enableViewState="false">
Code Climber和这个博客文章提供了提高应用程序性能的详细方法。
编译查询会提高应用程序的性能,但与ASP.NET MVC没有任何共同之处。 它会加快每个数据库应用程序,所以它不是真的关于MVC。
基本的build议是遵循REST原则 ,以下几点将这些原则与ASP.NET MVC框架联系起来:
- 让你的控制器无状态 – 这更像是一个“ Web性能/可伸缩性”的build议(而不是微观/机器级别的性能)和一个主要的devise决定,这会影响你的应用程序的未来 – 特别是在它变得stream行或者如果你需要例如容错。
- 不要使用会话
- 不要使用使用会话的tempdata
- 不要试图'提前'caching'一切'。
- 使用表单authentication
- 将经常访问的敏感数据保存在身份validation票证中
- 对经常访问的非敏感信息使用Cookie
- 使您的资源在networking上可以caching
- 利用ETags
- 使用到期
- 编写自定义的ActionResult类,如果有必要
- 利用反向代理
- 编译你的JavaScript。 还有Closure编译器库 (确定还有其他的,也只是search'JavaScript编译器' )
- 使用CDN(内容传送networking) – 尤其是对于大型媒体文件等。
- 考虑数据的不同types的存储,例如文件,键/值存储等 – 不仅仅是SQL Server
- 最后但并非最不重要的,testing您的网站的性能
这看起来很明显,但是在发布模式下而不是在debugging模式下运行你的站点,在生产阶段以及在性能分析过程中。 发布模式要快得多。 debugging模式可以隐藏自己的代码中的性能问题。
当通过LINQ访问数据依赖于IQueryable …
为什么使用AsQueryable()而不是List()?
…并创build一个良好的Repository模式:
在存储库模式中加载子logging
这将优化数据访问,以确保只有需要的数据被加载,并且只在需要的时候才被加载。
不是一个惊天动地的优化,但我想我会扔在那里 – 使用CDN的jQuery等 。
ScottGu自己引用:Microsoft Ajax CDN使您能够显着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗体和ASP.NET MVC应用程序的性能。 该服务免费提供,不需要任何注册,可用于商业和非商业目的。
我们甚至在使用jQuery的Moss的web部件中使用CDN。
另外,如果您使用NHibernate,您可以打开并设置查询的二级caching,并添加到查询范围和超时。 还有EF ,L2S和NHibernate的kick ass profiler – http://hibernatingrhinos.com/products/UberProf 。 这将有助于调整您的查询。
除了在服务器端优化你的应用程序的所有信息之外,我还要说你应该看看YSlow 。 这是提高客户端网站性能的极好资源。
这适用于所有网站,不仅仅是ASP.NET MVC。
一个非常容易的事情就是在访问页面所需的数据时进行asynchronous思考。 无论是从Web服务,文件,数据库还是其他内容读取,都尽可能使用asynchronous模式。 虽然它不一定能帮助任何一个页面加快速度,但它将帮助您的服务器更好地执行整体。
我还将补充:
-
使用精灵 :精灵是一个伟大的事情,以减less请求。 你将所有的图像合并为一个,并使用CSS来获得精灵的好处。 微软提供了一个很好的库: Sprite和Image Optimization Preview 4 。
-
caching您的服务器对象 :如果您有一些引用列表或数据很less发生更改,则可以将它们caching到内存中,而不是每次查询数据库。
-
使用ADO.NET而不是entity framework :
EF4 or EF5
可以减less开发时间,但是优化会很痛苦。 优化存储过程比entity framework更简单。 所以你应该尽可能地使用存储过程。 Dapper提供了一种查询和映射SQL的简单方法,性能非常好。 -
caching页面或部分页面 :MVC提供了一些简单的filter来caching页面根据一些参数,所以使用它。
-
减less数据库调用 :您可以创build一个返回多个对象的唯一数据库请求。 检查Dapper网站。
-
总是有一个干净的架构 :即使在一个小项目,也要有一个干净的n层架构。 它将帮助你保持你的代码清洁,如果需要的话,它会更容易优化。
-
你可以看看这个模板“ Neos-SDI MVC模板 ”,它将为你创build一个干净的架构,默认情况下有很多性能改进(检查MvcTemplate网站)。
1:获得时间。 直到你知道经济放缓的地步,这个问题太广泛了。 我正在做的一个项目有这个确切的问题; 甚至不知道某些事情需要多长时间; 我们只能猜测应用程序的缓慢部分,直到我们添加到项目的时间。
2:如果你有连续的操作,不要害怕轻微的multithreading。 特别是如果阻塞操作涉及。 PLINQ在这里是你的朋友。
3:在发布时预生成MVC视图…这将有助于一些“第一页命中”
4:有些人认为存储过程/ ADO的速度优势。 其他人则认为EF的发展速度,以及更明确的层级和目的。 当SQL和使用Sprocs / Views进行数据检索和存储的解决方法时,我已经看到了非常慢的devise。 另外,你的testing难度也会上升。 我们目前从ADO转换到EF的代码库并没有比旧的手动模型更糟(在某些情况下更好)。
5:这就是说,想想应用程序的热身。 我们所做的一部分工作是帮助消除我们大部分的EF性能问题,这是为了增加一种特殊的热身方法。 它不会预编译任何查询或任何东西,但它有助于大部分的元数据加载/生成。 在处理Code First模型时,这可能更为重要。
6:正如其他人所说,如果可能,请勿使用会话状态或ViewState。 它们不一定是开发人员想到的性能优化,但是一旦开始编写更复杂的Web应用程序,就需要响应能力。 会话状态排除了这一点。 想象一下长时间运行的查询。 你决定打开一个新窗口,尝试一个不太复杂的窗口。 那么,你可能已经等待会话状态,因为服务器将等待,直到第一个请求完成,然后移动到下一个会话。
7:最小化往返数据库。 保存你经常使用的东西,但实际上并不会改变你的.Netcaching。 尝试在可能的情况下批量插入/更新。
7.1:避免Razor视图中的数据访问代码没有一个很好的理由。 如果我没有看到,我不会说这个。 当把模型放在一起时,他们已经在访问他们的数据了,为什么他们不把它们包括在模型中呢?
只是想补充我的2美分。 在MVC应用程序中优化URLpath生成的最有效方法是……根本不生成它们。
我们中的大多数人或多或less知道如何在我们的应用程序中生成URL,所以简单地使用静态Url.Content("~/Blahblah")
而不是Url.Action()
或Url.RouteUrl()
几乎是20倍甚至更多。
PS。 我已经运行了几千次迭代的基准,并在我的博客上发布结果,如果感兴趣。
在优化客户端的呼声中,不要忘记数据库层。 我们有一个应用程序从5秒到50秒过夜。
在检查中,我们做了一大堆架构更改。 一旦我们刷新统计数据,它突然变得像以前一样敏感。
- 实施Gzip。
- 对部分视图使用asynchronous渲染。
- 最小化数据库命中。
- 使用编译的查询。
- 运行一个分析器,找出不必要的命中。 优化所有超过1秒的存储过程以返回响应。
- 使用caching。
- 使用捆绑缩小优化。
- 将会话caching和本地存储等HTML 5实用程序用于只读内容。
以下是要做的事情
- 内核模式caching
- pipe道模式
- 删除未使用的模块
- runAllManagedModulesForAllRequests
- 不要在wwwroot中写入
- 删除未使用的视图引擎和语言
使用捆绑和缩小还可以帮助您提高性能。 它基本上减less了页面加载时间。