如何提高ASP.NET MVC应用程序性能?

220

如何提高ASP.NET MVC应用程序的性能?

19个回答

321

下面是一份已编制好的可能引起改进的来源列表:

通用

  • 使用分析器来发现应用程序中的内存泄漏和性能问题。个人建议使用dotTrace
  • 在生产环境中以及性能分析期间运行您的站点时,请将其设置为发布模式,而不是调试模式。发布模式更快。调试模式可能会隐藏代码中的性能问题。

缓存

  • 使用CompiledQuery.Compile()递归地避免重新编译查询表达式。
  • 使用OutputCacheAttribute缓存不易更改的内容,以节省不必要的操作执行。
  • 对于频繁访问的非敏感信息,使用Cookie。
  • 利用ETags和过期时间——如有必要,请编写自定义的ActionResult方法。
  • 考虑使用RouteName来组织路由,然后使用它来生成链接,并尽量不要使用基于表达式树的ActionLink方法。
  • 考虑实现路由解析缓存策略。
  • 将重复的代码放入PartialViews中,避免多次渲染:如果您在同一个视图中调用同一个部分300次,那么可能存在问题。解释和基准测试

路由

安全性

  • 使用表单身份验证,在身份验证票证中保存您经常访问的敏感数据

DAL

负载均衡

  • 使用反向代理将客户端负载分散到应用程序实例中。(Stack Overflow 使用HAProxy (MSDN)。

  • 使用异步控制器来实现依赖于外部资源处理的动作。

客户端

  • 优化您的客户端,使用类似YSlow的工具提供的建议以提高性能。
  • 使用 AJAX 来更新您的 UI 组件,在可能的情况下避免整个页面的刷新。
  • 考虑实施发布-订阅架构,即“彗星”,针对基于超时的内容传递而不是重新加载。
  • 如果可以的话,将图表和图形生成逻辑移动到客户端。生成图形是一个耗费资源的活动。将这一任务转移至客户端可减轻服务器的负担,同时不必发出新请求(例如 Flex charting、jqbargraphMoreJqueryCharts)。
  • 使用 CDN 来提高客户端的加载速度(例如Google CDN)。
  • 将您的 JavaScript 进行压缩-编译-,以改善脚本大小。
  • 保持 cookie 大小小,因为每个请求都会将 cookie 发送到服务器。
  • 在可能的情况下,考虑使用DNS 和 Link Prefetching

全局配置

  • 如果您使用Razor,请在global.asax.cs中添加以下代码,默认情况下,Asp.Net MVC会使用aspx引擎和razor引擎进行渲染。这只使用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中),如果不使用ViewState,则禁用ViewState。 <pages buffer="true" enableViewState="false">

6
你的意思是当我通过IList循环显示结果集并为每个列表项调用Render.PartialView("Row", item)时,会失去性能?我会失去多少性能?或者我该如何衡量性能提升? - marc.d
@SDReyes - 什么是 发布-订阅架构 的意思? - Zameer Ansari
1
这很棒。不过Uber Profiler的链接已经失效了。这应该与特定于ORM的分析器之一建立链接吗? - shanabus

12

基本建议是遵循REST原则,以下几点将这些原则与ASP.NET MVC框架联系起来:

  1. 使你的控制器成为无状态 - 这更多是一个'Web性能/可扩展性'建议(而不是微观/机器级性能),这是一个重大的设计决策,会影响你的应用程序未来 - 特别是在它变得流行或者你需要一些容错性的情况下。
    • 不要使用Sessions
    • 不要使用临时数据 - 它使用Sessions
    • 不要试图'过早地'缓存所有内容。
  2. 使用表单身份验证
    • 将频繁访问的敏感数据保存在身份验证票证中
  3. 对于经常被访问的非敏感信息,请使用cookies
  4. 使你的资源可缓存在Web上
  5. 编译你的JavaScript。有Closure编译器库可以完成这项工作(当然还有其他的,只需搜索'JavaScript编译器'
  6. 使用CDN(内容分发网络)- 特别是针对你的大型媒体文件等。
  7. 考虑为你的数据使用不同类型的存储,例如文件、键/值存储等 - 不仅仅是SQL Server
  8. 最后但并非最不重要的是,测试你的网站性能

10

Code Climber这篇博客文章提供了详细的提高应用程序性能的方法。

编译查询可以提高应用程序的性能,但它与ASP.NET MVC无关。它可以加速每个数据库应用程序,因此这不是MVC的主题。


8

这可能很显然,但在生产环境和性能分析期间,请将您的站点运行在发布模式下,而不是调试模式下。发布模式要快得多。调试模式可能会隐藏您自己代码中的性能问题。


6

这并不是一个惊天动地的优化,但我想提出这个建议 - 使用CDN来加载jQuery等内容

引用ScottGu的话:Microsoft Ajax CDN 可以显著提高使用ASP.NET AJAX或jQuery的ASP.NET Web Forms和ASP.NET MVC应用程序的性能。该服务免费提供,无需注册,可用于商业和非商业用途。

我们甚至在使用jQuery的Moss网页部件中也使用CDN。


6

6

Ayende最近在博客中提到了EF Profiler如何帮助他调优一个示例的MVC应用程序:http://ayende.com/Blog/archive/2010/05/17/analyzing-the-mvc-music-store-data-access.aspx - Frank Schwieterman

5

我也会添加:

  1. 使用Sprites:Sprites是减少请求的好方法。您可以将所有图像合并成一个单独的图像,并使用CSS来获取Sprite的好部分。Microsoft提供了一个很好的库来实现这一点:Sprite和Image Optimization Preview 4

  2. 缓存服务器对象:如果您有一些引用列表或数据很少更改,可以将它们缓存在内存中,而不是每次查询数据库。

  3. 使用ADO.NET而不是Entity FrameworkEF4或EF5很适合减少开发时间,但优化起来会很痛苦。优化存储过程比Entity Framework更简单。因此,尽可能使用存储过程。Dapper提供了一种简单的方法来查询和映射SQL,性能非常好。

  4. 缓存页面或部分页面:MVC提供了一些易于过滤的方法,根据某些参数缓存页面,因此请使用它。

  5. 减少数据库调用:您可以创建一个唯一的数据库请求,返回多个对象。在Dapper网站上检查。

  6. 始终具有清晰的架构:即使在小项目中,也要拥有清晰的n层架构。这将有助于保持代码清洁,并且如果需要,更容易优化它。

  7. 您可以查看此模板“Neos-SDI MVC Template”,它将为您创建一个干净的架构,并具有许多默认的性能改进(请检查MvcTemplate网站)。


你认为是运行一个返回多个结果集的存储过程比在异步模式下运行更多的存储过程更好吗? - Muflix

4
除了优化服务器端应用程序的所有重要信息外,我认为您应该查看YSlow。这是一个非常好的资源,可以改善客户端性能。

这适用于所有网站,而不仅仅是ASP.NET MVC。


3

有一个非常简单的方法,就是在访问页面所需的数据时异步思考。无论是从Web服务、文件、数据库或其他地方读取数据,尽可能使用异步模式。虽然这不一定会使任何一个页面更快,但它将有助于整体提高服务器的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接