如何提高ASP.NET MVC应用程序的性能?
答案 0 :(得分:304)
可能的改进来源的汇编清单如下:
常规强>
缓存
CompiledQuery.Compile()
递归地避免
重新编译您的查询
表达式OutputCacheAttribute
以节省不必要的和行动
执行ActionResult
方法RouteName
来组织您的路线,然后使用它来生成
您的链接,并尽量不使用基于表达式的ActionLink方法。 PartialViews
内,避免将其渲染为 xxxx 次:如果你
最终在相同的视图中调用相同的部分300次,可能有一些东西
错了。 Explanation And Benchmarks <强>路由强>
使用Url.RouteUrl("User", new { username = "joeuser" })
指定路线。 ASP.NET MVC Perfomance by Rudi Benkovic
使用此帮助程序缓存路由解析UrlHelperCached
ASP.NET MVC Perfomance by Rudi Benkovic
安全强>
<强> DAL 强>
负载平衡
使用Asynchronous Controllers实施依赖于外部资源处理的操作。
客户端
全局配置
如果您使用Razor,请在global.asax.cs中添加以下代码,默认情况下,Asp.Net MVC使用aspx引擎和剃刀引擎进行渲染。这只使用RazorViewEngine。
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
在web.config中添加gzip(HTTP压缩)和静态缓存(images,css,...)
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
答案 1 :(得分:11)
基本建议是遵循REST principles,以下几点将这些主要内容与ASP.NET MVC框架联系起来:
答案 2 :(得分:10)
Code Climber和this blog entry提供了提高应用程序性能的详细方法。
编译查询将提高应用程序的性能,但它与ASP.NET MVC没有任何共同之处。它将加速每个数据库应用程序,因此它并不是真正的MVC。
答案 3 :(得分:7)
这看似显而易见,但在生产模式和性能分析期间,您可以在发布模式下运行站点,而不是调试模式。发布模式很多更快。调试模式可以隐藏您自己代码中的性能问题。
答案 4 :(得分:6)
通过LINQ访问数据依赖于IQueryable ......
Why use AsQueryable() instead of List()?
...并获得良好的存储库模式:
Loading Subrecords in the Repository Pattern
这将优化数据访问,以确保仅加载所需的数据以及何时只需要它。
答案 5 :(得分:6)
此外,如果您使用NHibernate,您可以打开并为查询设置二级缓存,并添加到查询范围和超时。还有EF,L2S和NHibernate - http://hibernatingrhinos.com/products/UberProf的kick ass profiler。它将有助于调整您的查询。
答案 6 :(得分:6)
不是一个惊天动地的优化,但我想我会把它扔出去 - Use CDN's for jQuery, etc.。
来自ScottGu本人的引用:Microsoft Ajax CDN使您能够显着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗体和ASP.NET MVC应用程序的性能。该服务免费提供,无需任何注册,可用于商业和非商业用途。
我们甚至将CDN用于使用jQuery的Moss中的webparts。
答案 7 :(得分:5)
我还要补充:
使用精灵:精灵是减少请求的好方法。您将所有图像合并为一个图像并使用CSS来实现 精灵的一部分。 Microsoft提供了一个很好的库来实现它: Sprite and Image Optimization Preview 4
缓存您的服务器对象:如果您有一些参考列表或数据很少会发生变化,您可以将它们缓存到内存中,而不是每次都查询数据库。
使用ADO.NET而不是实体框架:EF4 or EF5
非常适合缩短开发时间,但优化会很痛苦。
优化stored procedure比实体更简单
框架。所以你应该尽可能地使用商店程序。
Dapper提供了一种非常好的查询和映射SQL的简单方法
性能
缓存页面或部分页面:MVC根据某些参数为缓存页面提供了一些简单的过滤器,因此请使用它。
减少数据库调用:您可以创建一个返回多个对象的唯一数据库请求。查看Dapper网站。
始终拥有干净的架构:拥有干净的n层架构,即使是在小型项目上也是如此。它将帮助您保持代码清洁,并在需要时更容易优化代码。
您可以查看此模板“Neos-SDI MVC Template” 这将为你创造一个干净的架构 默认情况下性能改进(检查MvcTemplate 网站)。
答案 8 :(得分:4)
除了在服务器端优化应用程序的所有重要信息之外,我还要说你应该看看YSlow。它是提高客户端站点性能的绝佳资源。
这适用于所有网站,而不仅仅是ASP.NET MVC。
答案 9 :(得分:3)
一件非常容易的事情就是在访问页面所需的数据时异步思考。无论是从Web服务,文件,数据库还是其他内容中读取,都要尽可能使用异步模型。虽然它不一定能帮助任何一个页面更快,但它将帮助您的服务器整体表现更好。
答案 10 :(得分:2)
1:获得计时。直到你知道减速的位置,这个问题太广泛了。我正在研究的一个项目有这个确切的问题;甚至不知道某些事情需要多长时间;在我们为项目添加时间之前,我们只能猜测应用程序的缓慢部分。
2:如果你有顺序操作,不要害怕轻微多线程。特别是如果涉及阻止操作。 PLINQ是你的朋友。
3:发布时预生成你的MVC视图...这将有助于一些“首页点击”
4:有些人认为存储过程/ ADO的速度优势。其他人则争论EF的发展速度以及更清晰的层级划分和目的。我在SQL和使用Sprocs / Views进行数据检索和存储的变通方法时看到了非常慢的设计。此外,你的测试难度上升。我们当前从ADO转换为EF的代码库与旧的Hand-Rolled模型相比没有表现得更差(在某些情况下更好)。
5:那就是说,想想申请热身。我们为帮助消除大部分EF性能问题而采取的部分措施是添加一种特殊的预热方法。它不会预编译任何查询或任何内容,但它有助于大部分元数据加载/生成。在处理Code First模型时,这可能更为重要。
6:正如其他人所说,如果可能,请不要使用Session状态或ViewState。它们不一定是开发人员考虑的性能优化,但是一旦开始编写更复杂的Web应用程序,就需要响应能力。会话状态排除了这一点。想象一下长时间运行的查询。您决定打开一个新窗口并尝试不那么复杂的窗口。好吧,您也可以等待会话状态,因为服务器将等到第一个请求完成后再移动到该会话的下一个请求。
7:尽量减少到数据库的往返次数。保存您经常使用但不会真正改变您的.Net缓存的内容。尝试尽可能批量插入/更新。
7.1:在没有充分理由的情况下,在Razor视图中避免使用数据访问代码。如果我没有看到它,我不会这样说。在将模型放在一起时,他们已经在访问他们的数据了,为什么他们不在模型中包含它?
答案 11 :(得分:2)
答案 12 :(得分:2)
只想加2美分。在MVC应用程序中优化URL路由生成的最有效方法是......根本不生成它们。
我们大多数人或多或少都知道如何在我们的应用中生成网址,因此只需使用静态Url.Content("~/Blahblah")
代替Url.Action()
或Url.RouteUrl()
,几乎可以使用所有其他方法20次甚至更多。
PS。如果感兴趣的话,我已经运行了几千次迭代的基准测试并发布了结果on my blog。
答案 13 :(得分:1)
在要求优化客户端的喧嚣中,不要忘记数据库层。我们有一个应用程序,从5秒加载到50秒过夜。
在检查时,我们做了一大堆架构更改。一旦我们刷新了统计数据,就会突然变得像以前一样响应。
答案 14 :(得分:0)
以下是可以做的事情
答案 15 :(得分:0)
使用捆绑和缩小还可以帮助您提高性能。它基本上减少了页面加载时间。
答案 16 :(得分:0)
如果您正在Microsoft Azure(IaaS或PaaS)上运行ASP.NET MVC应用程序,则至少在第一次部署之前执行以下操作。
答案 17 :(得分:0)
根据.Net版本,使用最新版本的任务并行库(TPL)。必须为不同的目的选择正确的TPL模块。
答案 18 :(得分:0)
我做了上面所有的回答,但并不能解决我的问题。
最后,我通过将发布配置文件中的 PrecompileBeforePublish 设置为 true 解决了网站加载缓慢的问题。如果要使用 msbuild ,可以使用以下参数:
/p:PrecompileBeforePublish=true
确实有很大帮助。现在,我的MVC ASP.NET加载速度提高了10倍。