如何改善ASP.NET MVC应用程序性能?


Answers:


311

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

一般

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

快取

  • CompiledQuery.Compile() 递归使用避免重新编译查询表达式
  • 缓存不易于更改的内容,OutputCacheAttribute 以节省不必要的操作执行
  • 使用Cookie获取经常访问的非敏感信息
  • 利用ETag和有效期- ActionResult必要时编写自定义方法
  • 请考虑使用RouteName来组织您的路线,然后使用它来生成链接,并尽量不要使用基于表达式树的ActionLink方法。
  • 考虑实施路由解析缓存策略
  • 将重复代码放在您的内PartialViews,避免渲染xxxx次:如果最终在同一视图中调用了相同的部分300次,则可能是有问题的。解释和基准

路由

安全

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

DAL

负载均衡

  • 利用反向代理,将客户端负载分散到您的应用程序实例中。(堆栈溢出使用HAProxyMSDN)。

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

客户端

  • 优化您的客户端,使用YSlow之类的工具来提高性能的建议
  • 使用AJAX更新UI的组件,尽可能避免整个页面的更新。
  • 考虑实现发布-订阅体系结构(即Comet),以根据超时重新加载内容。
  • 如果可能,将图表和图形生成逻辑移至客户端。图形生成是一项昂贵的活动。将服务器的工作负担减轻了不必要的负担,并允许您在本地处理图形而无需发出新的请求(即Flex图表,jqbargraphMoreJqueryCharts)。
  • 使用CDN的脚本和媒体内容来改善客户端的负载(例如Google CDN
  • 缩小- 编译 -您的JavaScript,以提高脚本大小
  • 由于cookie会在每次请求时都发送到服务器,因此请保持cookie较小。
  • 考虑尽可能使用DNS和链接预取

全局配置

  • 如果使用Razor,请在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中),如果不使用它,则禁用viewstate <pages buffer="true" enableViewState="false">

6
等一下,我的意思是我确实失去了性能,例如当我有一个视图,该视图通过刺激IList并为每个列表项调用Render.PartialView(“ Row”,item)来显示结果集时?我输了多少钱?或者我该如何衡量性能提升?
marc.d 2010年

@SDReyes- pub-sub体系结构是什么意思?
Mohammed Zameer

1
这很酷。Uber Profiler链接已死。应该将此链接链接到ORM特定的探查器之一吗?
shanabus

12

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

  1. 使您的控制器无状态 -这更多是“ Web性能/可伸缩性”建议(而不是微机/计算机级性能),并且是可能影响您应用程序未来的重大设计决策-特别是在应用变得流行或需要一些应用的情况下例如容错。
    • 不使用会话
    • 不要使用tempdata-它使用会话
    • 不要尝试“过早”缓存所有内容。
  2. 使用表单身份验证
    • 将您经常访问的敏感数据保留在身份验证票证中
  3. 使用Cookie获取经常访问的非敏感信息
  4. 使您的资源可在网络上访问
  5. 编译您的JavaScript。也有Closure编译器库可以做到这一点(确保还有其他库,也只需搜索“ JavaScript编译器”)。
  6. 使用CDN(内容交付网络)-特别是对于大型媒体文件等。
  7. 考虑数据的不同类型的存储,例如文件,键/值存储等-不仅限于SQL Server
  8. 最后但并非最不重要的一点是,测试您的网站的性能

10

Code Climber此博客条目提供了提高应用程序性能的详细方法。

编译查询将提高应用程序的性能,但与ASP.NET MVC没有任何共同之处。它将加快每个数据库应用程序的速度,因此它与MVC无关。


7

这看起来似乎很明显,但是在生产中以及性能分析期间,以发布模式而不是调试模式运行站点。释放模式快得多。调试模式可以在您自己的代码中隐藏性能问题。



6

这不是一个破天荒的优化,但我想我应该把它扔掉- 将CDN用于jQuery等

引用ScottGu本人的话:Microsoft Ajax CDN使您能够显着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗体和ASP.NET MVC应用程序的性能。该服务是免费提供的,不需要任何注册,并且可以用于商业和非商业目的。

我们甚至在使用jQuery的Moss中将CDN用于我们的Web部件。



5

我还将添加:

  1. 使用Sprites:Sprites是减少请求的好方法。您将所有图像合并到一个图像中,并使用CSS来获取精灵的大部分。Microsoft提供了一个很好的库来做到这一点: Sprite和Image Optimization Preview 4

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

  3. 使用ADO.NET而不是Entity FrameworkEF4 or EF5可以减少开发时间,但是优化起来很麻烦。优化存储过程比实体框架更简单。因此,您应尽可能使用存储过程。Dapper提供了一种查询和映射SQL的简单方法,性能非常好。

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

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

  6. 始终拥有干净的体系结构:即使在小型项目中,也要拥有干净的n层体系结构。它可以帮助您保持代码的清洁,并且在需要时可以更轻松地对其进行优化。

  7. 您可以看一下该模板“ Neos-SDI MVC模板 ”,它将为您创建一个干净的体系结构,默认情况下具有许多性能改进(请 访问MvcTemplate网站)。


您是否认为最好运行一个存储过程,该存储过程返回更多结果集,然后在异步模式下运行更多存储过程?
Muflix '16

4

除了在服务器端优化应用程序的所有重要信息之外,我还想说您应该看看YSlow。这是用于改善客户端网站性能的绝佳资源。

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


3

一件超级容易的事情是访问页面所需的数据时异步考虑。无论是从Web服务,文件,数据库还是其他内容中读取数据,都应尽可能使用异步模型。虽然不一定能使任何一页更快,但可以帮助您的服务器整体上表现更好。


2

1:获取时间。在您知道增长放缓的位置之前,这个问题太广泛了,无法回答。我正在研究的项目存在这个确切的问题。没有日志可以知道某些事情需要花费多长时间。我们只能猜测应用程序的慢速部分,直到我们向项目添加时间。

2:如果您有顺序操作,请不要害怕轻度使用多线程。特别是如果涉及阻塞操作。PLINQ是您的朋友在这里。

3:发布时预先生成MVC视图...这将有助于部分“首页匹配”

4:有人争辩说存储过程/ ADO具有速度优势。其他人则主张加快EF的发展速度,并明确区分各个等级及其目的。当SQL和使用Sprocs / Views进行数据检索和存储的变通办法时,我已经看到了非常缓慢的设计。另外,您的测试难度也会增加。我们正在从ADO转换为EF的当前代码库的性能没有比旧的Hand-Rolled模型更糟糕(在某些情况下还更好)。

5:也就是说,考虑一下应用程序热身。为了帮助消除大多数EF性能困扰,我们要做的部分工作就是添加一种特殊的预热方法。它不会预编译任何查询或任何内容,但有助于大部分元数据的加载/生成。在处理Code First模型时,这一点甚至更为重要。

6:正如其他人所说,请尽可能不要使用Session state或ViewState。它们不一定是开发人员考虑的性能优化,但是一旦您开始编写更复杂的Web应用程序,就需要响应能力。会话状态排除了这一点。想象一下长时间运行的查询。您决定打开一个新窗口,然后尝试一个不太复杂的窗口。好吧,您可能还需要等待会话状态,因为服务器将等到第一个请求完成后再移到该会话的下一个请求。

7:最小化数据库往返。保存您经常使用但实际上不会更改为.Net缓存的内容。尝试在可能的情况下分批插入/更新。

7.1:毫无理由地避免在Razor视图中使用数据访问代码。如果我没有看过我就不会说这个。他们在将模型放在一起时已经在访问数据,为什么他们不将数据包括在模型中呢?


2
  1. 实施Gzip。
  2. 对部分视图使用异步渲染。
  3. 最小化数据库命中。
  4. 使用已编译的查询。
  5. 运行探查器,找出不必要的点击。优化所有花费超过1秒才能返回响应的存储过程。
  6. 使用缓存。
  7. 使用捆绑最小化优化。
  8. 将会话缓存和本地存储之类的HTML 5实用程序用于只读内容。

2

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

我们大多数人或多或少都知道如何在我们的应用程序中生成URL,因此简单地使用static Url.Content("~/Blahblah")代替Url.Action()Url.RouteUrl()在可能的情况下,将所有其他方法击败几乎20倍甚至更多。

PS。如果有兴趣,我已经运行了数千次迭代的基准测试,并将结果发布到了我的博客上


1

在大声疾呼优化客户端的过程中,请不要忘记数据库层。我们的应用程序从5秒加载到一夜之间最多可以加载50秒。

经过检查,我们进行了很多模式更改。刷新统计信息后,它突然变得像以前一样敏感。



0

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


0

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

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

0

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


0

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

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

 /p:PrecompileBeforePublish=true

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.