你如何提高你的ASP.NET MVC应用程序性能?如何提高ASP.NET MVC应用程序的性能?
回答
的改善可能来源的汇总列表低于:
一般
- 制作使用探查,发现在你的应用程序的内存泄漏和性能问题。我个人建议dotTrace
- 在发布模式下运行您的站点,而不是在调试模式下,在生产环境中以及性能分析过程中。发布模式要快得多。调试模式可以隐藏自己的代码中的性能问题。
缓存
- 使用
CompiledQuery.Compile()
递归避免 重新编译查询的 表达式中使用OutputCacheAttribute
节省不必要和行动 执行 - 缓存不倾向对变化 内容
- U SE饼干的频繁访问的非敏感信息
- 利用ETags和过期 - 编写自定义
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
- 通过LINQ rely on IQueryable
- Leverage the Repository pattern
- 简介您的疑问,即Uber Profiler
- 考虑二级缓存为您查询并添加它们的范围和超时即NHibernate Second Cache 访问数据时
负载均衡
使用Asynchronous Controllers实现依赖于外部资源的处理动作。
客户端
- 优化您的客户端,使用工具如YSlow对于 提高性能的建议
- 使用AJAX更新UI的组件,尽可能避免整个页面更新。
- 考虑实施pub-sub架构 - 即。 Comet-针对内容传输,基于超时重新加载 。
- 如果可能的话,将图表和图表生成逻辑移动到客户端。图表生成 是一个昂贵的活动。将服务器从 不必要的负担延迟到客户端,并且允许您在本地使用图形,而无需发出新的 请求(即Flex图表,jqbargraph,MoreJqueryCharts)。
- 使用CDN对脚本和媒体内容,以提高在客户端负载(即Google CDN)
- 缩减大小 - 为了提高你的脚本大小
- 保持饼干体积小,因为cookie被发送到你的JavaScript - Compile每个请求上的服务器。
- 尽可能考虑使用DNS and Link Prefetching。
全局配置
如果使用剃刀,添加以下代码在你的global.asax.cs,默认情况下,Asp.Net MVC呈现与一个aspx发动机和剃刀引擎。这只使用RazorViewEngine。
ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());
在你的web.config添加的gzip(HTTP压缩)和静态缓存(图片,CSS,...)
<system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>
- 删除未使用的HTTP模块
- 刷新你的HTML作为一旦它生成(在你的web.config中),并禁用视图状态,如果你不使用它
<pages buffer="true" enableViewState="false">
不是一个惊天动地的优化,但我想我会把它扔到那里 - Use CDN's for jQuery, etc.。
ScottGu自己引用:Microsoft Ajax CDN使您能够显着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗体和ASP.NET MVC应用程序的性能。该服务免费提供,不需要任何注册,可用于商业和非商业用途。
我们甚至在使用jQuery的Moss的web部件中使用CDN。
的基本建议是遵循REST principles及以下几点捆绑一些校长到ASP.NET MVC框架:
- 让你的控制器stateless - 这更是一个“网络的性能 /可扩展性“的建议(而不是微观/机器级别的性能)以及可能会影响您应用程序未来的主要设计决策 - 尤其是在它变得流行或者您需要某种容错功能的情况下。
- 不要使用会话
- 不要使用TempData的 - 它使用会话
- 不要试图“缓存”一切“过早”。
- 使用Forms Authentication
- 让您经常访问的敏感数据在身份验证票证
- 为经常访问的非敏感信息
- 使用Cookie在网络上让你resources cachable
- Utilize ETags
- 使用截止
- 如果有必要编写自定义的ActionResult类
- 利用reverse proxies
- 编译你的JavaScript。 There is Closure compiler library也可以这样做(当然也可以使用there are others, just search for 'JavaScript compiler')
- 使用CDN(内容传送网络) - 尤其是对于大型媒体文件等。
- 考虑不同类型的存储你的数据,例如,文件,键/值存储,等等 - 不仅是SQL Server的
- 最后但并非最不重要的,测试您的网站性能
Code Climber和this blog entry提供了提高应用程序性能的详细方法。
编译查询会提高应用程序的性能,但它与ASP.NET MVC没有任何共同之处。它会加速每个数据库应用程序,所以它不是真的关于MVC。
通过LINQ访问数据时依靠的IQueryable ...
Why use AsQueryable() instead of List()?
...和leverge良好的Repository模式:
Loading Subrecords in the Repository Pattern
这将优化数据访问,以确保只有需要的数据被加载并且只在需要时才加载。
另外,如果您使用NHibernate,则可以打开并为查询设置第二级缓存并添加到查询范围和超时。并且有EF,L2S和NHibernate的踢屁股分析器 - http://hibernatingrhinos.com/products/UberProf。这将有助于调整您的查询。
Ayende最近的博客上讲述EF探查如何帮助他调整一个样本MVC应用程序:http://ayende.com/Blog/archive/2010/05/17/analyzing-the-mvc-music-store-data-access.aspx – 2010-05-19 21:40:08
除了在服务器端优化您的应用程序的所有优秀信息,我会说你应该看看YSlow。这是提高客户端网站性能的极好资源。
这适用于所有网站,不仅仅是ASP.NET MVC。
一件非常容易的事就是在访问页面所需的数据时进行异步思考。无论是从Web服务,文件,数据库还是其他内容读取,都尽可能使用异步模型。虽然它不一定能帮助任何一个页面加快速度,但它会帮助您的服务器更好地执行整体。
这看起来很明显,但在发布模式下运行您的站点,而不是在调试模式下,在生产环境中以及性能分析过程中。发布模式是多了更快。调试模式可以隐藏自己的代码中的性能问题。
我也将增加:
使用精灵:精灵是减少请求一个伟大的事情。您将所有图像合并为一个图像,然后使用CSS获得精灵 的一部分。微软提供了一个很好的库: Sprite and Image Optimization Preview 4。
缓存服务器对象:如果你有一些参考表或数据将很少发生变化,您可以缓存他们到内存,而不是每次查询数据库。
使用ADO.NET,而不是实体框架:
EF4 or EF5
是伟大的,以缩短开发时间,但是这将是痛苦的优化。 优化stored procedure比实体 框架更简单。所以你应该尽可能地使用存储过程。 Dapper提供了一种简单的方式来查询和映射SQL,其性能非常好 。缓存页或部分页面:MVC根据一些参数提供了一些简单的缓存页面过滤器,所以使用它。
减少数据库调用:您可以创建一个返回多个对象的唯一数据库请求。检查Dapper网站。
总是有一个干净的架构:即使在一个小项目,也有一个干净的n层架构。它会帮助你保持你的代码清洁,如果需要的话,它会更容易优化。
你可以看看这个模板“Neos-SDI MVC Template” ,这将创造一个干净的架构,你有很多的默认 性能改进(检查MvcTemplate 网站)。
你认为运行一个返回更多结果集的存储过程更好,然后以异步模式运行更多的存储过程会更好吗? – Muflix 2016-08-09 16:57:09
1:获取计时。在你知道经济放缓之前,这个问题太广泛了,无法回答。我正在做的一个项目有这个确切的问题;没有记录甚至不知道某些事情需要多长时间;我们只能猜测应用程序的缓慢部分,直到我们为项目添加时间。
2:如果你有顺序操作,不要害怕轻微多线程。特别是如果涉及阻塞操作。 PLINQ是你的朋友。
3:预生成你的MVC视图时发布...这将与一些“第一页命中”
4的帮助:一些人对速度的存储过程/ ADO的优势。其他人则认为EF的发展速度以及更明确的层级和目的。当SQL和使用Sprocs/Views进行数据检索和存储的解决方法时,我已经看到了非常慢的设计。另外,你的测试难度也会增加。我们目前从ADO转换到EF的代码库并没有比旧的手动模型更糟糕(在某些情况下更好)。
5:这就是说,考虑应用热身。我们所做的一部分工作是帮助消除大部分EF性能问题,其中之一就是增加一种特殊的热身方法。它不会预编译任何查询或任何内容,但它有助于大部分元数据加载/生成。在处理Code First模型时,这可能更为重要。
6:正如其他人所说,如果可能,请勿使用会话状态或ViewState。它们不一定是开发人员想到的性能优化,但是一旦开始编写更复杂的Web应用程序,就需要响应能力。会话状态排除了这一点。想象一下长时间运行的查询。你决定打开一个新窗口,尝试一个不太复杂的窗口。那么,你可能已经等待会话状态,因为服务器将等到第一个请求完成,然后再转到该会话的下一个请求。 7:最小化到数据库的往返行程。保存您经常使用但不会真实改变到.Net缓存的内容。尝试在可能的情况下批量插入/更新。
7.1:避免在您的Razor视图中的数据访问代码没有一个很好的理由。如果我没有看到它,我不会说这个。他们已经在将模型放在一起时访问他们的数据,为什么他们不把它们包括在模型中?
在你闹着要优化客户端,不要忘了数据库层。我们有一个应用程序从5秒开始,在一夜之间加载到50秒。
在检查中,我们犯了一大堆的架构更改。一旦我们刷新统计数据,它突然变得像以前一样敏感。
- 实现Gzip已。
- 对部分视图使用异步渲染。
- 最小化数据库命中。
- 使用已编译的查询。
- 运行一个分析器并找出不必要的命中。优化所有超过1秒钟的存储过程以返回响应。
- 使用缓存。
- 使用bundling minification优化。
- 使用HTML 5实用程序(如会话高速缓存和本地存储)来实现只读内容。
以下是要做的事情
- 内核模式缓存
- 管道模式
- 删除未使用的模块
- runAllManagedModulesForAllRequests
- wwwroot中不要写
- 删除未使用的视图引擎和语言
使用捆绑和缩小也有助于提高性能。它基本上减少了页面加载时间。
只想添加我的2美分。在MVC应用程序中优化URL路径生成的最有效方法是......根本不生成它们。
我们大多数人或多或少知道网址是如何在我们的应用程序产生的,无论如何,单纯用静态Url.Content("~/Blahblah")
代替Url.Action()
或Url.RouteUrl()
在可能情况下,通过近20倍,甚至更击败所有其他方法。
PS。我已经运行了几千次迭代的基准,并且如果感兴趣,发布结果on my blog。
- 1. 如何提高ASP.NET MVC Web应用程序的性能?
- 2. 提高ASP.NET应用程序的性能
- 3. 如何提高asp.net应用程序的性能?
- 4. 如何提高ASP.net应用程序的性能
- 5. 提高Windows应用程序的性能
- 6. 提高Web应用程序的性能
- 7. Asp.net MVC实时应用程序性能
- 8. 线程 - 如何提高应用程序的性能
- 9. 提高图像应用程序性能
- 10. 提高android应用程序性能
- 11. 提高应用程序性能
- 12. FastCGI将如何提高我的PHP应用程序的性能?
- 13. 如何提高我的Web应用程序的性能?
- 14. 如何提高我的Ionic3 Anguar4应用程序的性能?
- 15. 如何分析ASP.NET MVC应用程序中的请求性能?
- 16. 提高ASP.NET MVC启动性能
- 17. 如何提高Web应用程序的图像加载性能?
- 18. 如何提高应用程序的性能
- 19. 代表如何提高应用程序的性能?
- 20. 如何提高我的iOS应用程序性能
- 21. 如何提高单页面应用程序的性能?
- 22. 如何提高Sencha Touch 2.x应用程序的性能
- 23. 如何提高VS11 Metro应用程序的性能?
- 24. 如何提高Flex应用程序的性能?
- 25. 如何提高SQLite + UITableView应用程序的性能?
- 26. 如何提高Web应用程序的性能?
- 27. ASP.NET - 提高性能
- 28. 如何提高ASP.NET MVC WEB API的性能?
- 29. ASP.Net应用程序的高可用性
- 30. Asp.Net应用程序性能
等你意味着我失去了表现,当我例如有一个视图通过IList激怒并显示结果集,并为每个列表项调用Render.PartialView(“Row”,item)?我输了多少?或者我怎么测量性能增益? – 2010-02-12 15:03:33
@SDReyes - ** pub-sub架构**的含义是什么? – xameeramir 2015-11-26 06:18:33
这很酷。 Uber Profiler链接已经死了。这应该与其中一个ORM特定的分析器链接吗? – shanabus 2016-12-07 19:57:02