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

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

可能的改进来源列表如下:

一般

  • 利用分析器来发现应用程序中的内存泄漏和性能问题。 我个人build议dotTrace
  • 在发布模式下运行您的站点,而不是在debugging模式下,在生产环境中以及性能分析过程中。 发布模式要快得多。 debugging模式可以隐藏自己的代码中的性能问题。

高速caching

  • 使用CompiledQuery.Compile()recursion地避免重新编译查询expression式
  • 使用OutputCacheAttributecaching不容易更改的内容,以节省不必要的操作和执行操作
  • 对经常访问的非敏感信息使用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框架联系起来:

  1. 让你的控制器无状态 – 这更像是一个“ Web性能/可伸缩性”的build议(而不是微观/机器级别的性能)和一个主要的devise决定,这会影响你的应用程序的未来 – 特别是在它变得stream行或者如果你需要例如容错。
    • 不要使用会话
    • 不要使用使用会话的tempdata
    • 不要试图'提前'caching'一切'。
  2. 使用表单authentication
    • 将经常访问的敏感数据保存在身份validation票证中
  3. 对经常访问的非敏感信息使用Cookie
  4. 使您的资源在networking上可以caching
    • 利用ETags
    • 使用到期
    • 编写自定义的ActionResult类,如果有必要
    • 利用反向代理
  5. 编译你的JavaScript。 还有Closure编译器库 (确定还有其他的,也只是search'JavaScript编译器' )
  6. 使用CDN(内容传送networking) – 尤其是对于大型媒体文件等。
  7. 考虑数据的不同types的存储,例如文件,键/值存储等 – 不仅仅是SQL Server
  8. 最后但并非最不重要的,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模式。 虽然它不一定能帮助任何一个页面加快速度,但它将帮助您的服务器更好地执行整体。

我还将补充:

  1. 使用精灵 :精灵是一个伟大的事情,以减less请求。 你将所有的图像合并为一个,并使用CSS来获得精灵的好处。 微软提供了一个很好的库: Sprite和Image Optimization Preview 4 。

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

  3. 使用ADO.NET而不是entity frameworkEF4 or EF5可以减less开发时间,但是优化会很痛苦。 优化存储过程比entity framework更简单。 所以你应该尽可能地使用存储过程。 Dapper提供了一种查询和映射SQL的简单方法,性能非常好。

  4. caching页面或部分页面 :MVC提供了一些简单的filter来caching页面根据一些参数,所以使用它。

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

  6. 总是有一个干净的架构 :即使在一个小项目,也要有一个干净的n层架构。 它将帮助你保持你的代码清洁,如果需要的话,它会更容易优化。

  7. 你可以看看这个模板“ 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秒过夜。

在检查中,我们做了一大堆架构更改。 一旦我们刷新统计数据,它突然变得像以前一样敏感。

  1. 实施Gzip。
  2. 对部分视图使用asynchronous渲染。
  3. 最小化数据库命中。
  4. 使用编译的查询。
  5. 运行一个分析器,找出不必要的命中。 优化所有超过1秒的存储过程以返回响应。
  6. 使用caching。
  7. 使用捆绑缩小优化。
  8. 将会话caching和本地存储等HTML 5实用程序用于只读内容。

以下是要做的事情

  1. 内核模式caching
  2. pipe道模式
  3. 删除未使用的模块
  4. runAllManagedModulesForAllRequests
  5. 不要在wwwroot中写入
  6. 删除未使用的视图引擎和语言

使用捆绑和缩小还可以帮助您提高性能。 它基本上减less了页面加载时间。