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

时间:2010-02-11 17:25:08

标签: .net asp.net-mvc performance iis

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

19 个答案:

答案 0 :(得分:304)

可能的改进来源的汇编清单如下:

常规

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

缓存

  • 使用CompiledQuery.Compile() 递归地避免 重新编译您的查询 表达式
  • 缓存不易发生变化 内容使用OutputCacheAttribute 以节省不必要的和行动 执行
  • 对经常访问的非敏感信息使用Cookie
  • 利用ETags并过期 - 必要时编写自定义ActionResult方法
  • 考虑使用RouteName来组织您的路线,然后使用它来生成 您的链接,并尽量不使用基于表达式的ActionLink方法。
  • 考虑实施路由解析缓存策略
  • 将重复的代码放入PartialViews内,避免将其渲染为 xxxx 次:如果你 最终在相同的视图中调用相同的部分300次,可能有一些东西 错了。 Explanation And Benchmarks

<强>路由

安全

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

<强> DAL

负载平衡

  • 利用反向代理,在您的应用实例中传播客户端负载。 (Stack Overflow使用HAProxyMSDN)。

  • 使用Asynchronous Controllers实施依赖于外部资源处理的操作。

客户端

  • 优化您的客户端,使用YSlow之类的工具 提高绩效的建议
  • 使用AJAX更新UI的组件,尽可能避免整页更新。
  • 考虑实现pub-sub架构-i.e. Comet-用于内容交付 基于超时重新加载。
  • 如果可能,将图表和图表生成逻辑移至客户端。图生成 是一项昂贵的活动。从客户端推送您的服务器 不必要的负担,并允许您在本地使用图形而不需要新的 请求(即Flex图表,jqbargraphMoreJqueryCharts)。
  • 将CDN用于脚本和媒体内容以改善客户端的加载(即Google CDN
  • 缩小 - Compile - 您的JavaScript以改善脚本大小
  • 保持cookie的大小,因为每次请求都会将cookie发送到服务器。
  • 考虑尽可能使用DNS and Link Prefetching

全局配置

  • 如果您使用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>

  • 删除未使用的HTTP模块
  • 在生成HTML(在web.config中)后立即刷新HTML,如果不使用它,则禁用viewstate <pages buffer="true" enableViewState="false">

答案 1 :(得分:11)

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

  1. 制作您的控制器stateless - 这更像是一个' Web 性能/可扩展性'建议(与微/机器级别性能相反)以及会影响您的主要设计决策应用程序的未来 - 特别是在它变得流行或者你需要一些容错的情况下。
    • 请勿使用会话
    • 不要使用tempdata - 使用会话
    • 不要试图“过早地”“缓存”所有内容。
  2. 使用Forms Authentication
    • 将经常访问的敏感数据保留在身份验证票据中
  3. 对经常访问的非敏感信息使用Cookie
  4. 在网上制作resources cachable
  5. 编译JavaScript。 There is Closure compiler library也可以这样做(确保there are others, just search for 'JavaScript compiler'也是如此)
  6. 使用CDN(内容分发网络) - 尤其适用于大型媒体文件等。
  7. 考虑不同类型的数据存储,例如文件,键/值存储等 - 不仅仅是SQL Server
  8. 最后但并非最不重要的是,测试您的网站的性能

答案 2 :(得分:10)

Code Climberthis 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)

我还要补充:

  1. 使用精灵:精灵是减少请求的好方法。您将所有图像合并为一个图像并使用CSS来实现 精灵的一部分。 Microsoft提供了一个很好的库来实现它: Sprite and Image Optimization Preview 4

  2. 缓存您的服务器对象:如果您有一些参考列表或数据很少会发生变化,您可以将它们缓存到内存中,而不是每次都查询数据库。

  3. 使用ADO.NET而不是实体框架EF4 or EF5非常适合缩短开发时间,但优化会很痛苦。 优化stored procedure比实体更简单 框架。所以你应该尽可能地使用商店程序。 Dapper提供了一种非常好的查询和映射SQL的简单方法 性能

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

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

  6. 始终拥有干净的架构:拥有干净的n层架构,即使是在小型项目上也是如此。它将帮助您保持代码清洁,并在需要时更容易优化代码。

  7. 您可以查看此模板“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)

  1. 实施Gzip。
  2. 对部分视图使用异步渲染。
  3. 最大限度地减少数据库命中。
  4. 使用已编译的查询。
  5. 运行探查器并找出不必要的命中。优化所有存储过程,这些过程需要1秒钟以上才能返回响应。
  6. 使用缓存。
  7. 使用bundling minification优化。
  8. 将会话缓存和本地存储等HTML 5实用程序用于只读内容。

答案 12 :(得分:2)

只想加2美分。在MVC应用程序中优化URL路由生成的最有效方法是......根本不生成它们。

我们大多数人或多或少都知道如何在我们的应用中生成网址,因此只需使用静态Url.Content("~/Blahblah")代替Url.Action()Url.RouteUrl(),几乎可以使用所有其他方法20次甚至更多。

PS。如果感兴趣的话,我已经运行了几千次迭代的基准测试并发布了结果on my blog

答案 13 :(得分:1)

在要求优化客户端的喧嚣中,不要忘记数据库层。我们有一个应用程序,从5秒加载到50秒过夜。

在检查时,我们做了一大堆架构更改。一旦我们刷新了统计数据,就会突然变得像以前一样响应。

答案 14 :(得分:0)

以下是可以做的事情

  1. 内核模式缓存
  2. 管道模式
  3. 删除未使用的模块
  4. runAllManagedModulesForAllRequests
  5. 请勿在wwwroot中撰写
  6. 删除未使用的视图引擎和语言

答案 15 :(得分:0)

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

答案 16 :(得分:0)

如果您正在Microsoft Azure(IaaS或PaaS)上运行ASP.NET MVC应用程序,则至少在第一次部署之前执行以下操作。

  • 使用静态代码分析器扫描代码,以检查任何类型的代码欠款,重复,复杂性和安全性。
  • 始终启用Application Insight,并经常监视性能,浏览器和分析以发现应用程序中的实时问题。
  • 实施Azure Redis缓存以获取静态和不经常更改的数据,例如图像,资产,通用布局等。
  • 始终依靠Azure提供的APM(应用程序性能管理)工具。
  • 经常查看应用程序映射以调查应用程序内部各部分之间的通信性能。
  • 也监视数据库/ VM性能。
  • 如果需要且在预算范围内,请使用负载均衡器(水平比例尺)。
  • 如果您的应用程序具有全球目标受众,则使用Azure Trafic Manager自动处理传入的请求并将其转移到最可用的应用程序实例。
  • 尝试通过基于性能低下的警报来自动执行性能监视。

答案 17 :(得分:0)

根据.Net版本,使用最新版本的任务并行库(TPL)。必须为不同的目的选择正确的TPL模块。

答案 18 :(得分:0)

我做了上面所有的回答,但并不能解决我的问题。

最后,我通过将发布配置文件中的 PrecompileBeforePublish 设置为 true 解决了网站加载缓慢的问题。如果要使用 msbuild ,可以使用以下参数:

 /p:PrecompileBeforePublish=true

确实有很大帮助。现在,我的MVC ASP.NET加载速度提高了10倍。