2010-02-11 130 views

回答

278

的改善可能来源的汇总列表低于:

一般

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

缓存

  • 使用CompiledQuery.Compile() 递归避免 重新编译查询的 表达式中使用OutputCacheAttribute 节省不必要和行动 执行
  • 缓存不倾向对变化 内容
  • U SE饼干的频繁访问的非敏感信息
  • 利用ETags和过期 - 编写自定义ActionResult方法,如果有必要
  • 考虑使用RouteName来组织你的路由,然后用它来生成 你的链接,并尽量不要使用基于表达树的ActionLink方法。
  • 考虑实施路由解析缓存策略
  • 把重复的代码你PartialViews内,避免使其XXXX次:如果你 最终调用相同部分的300倍,在同样的观点,有可能是一些 错误接着就,随即。 Explanation And Benchmarks

路由

安全

  • 使用表单身份验证解决,请您经常访问的敏感数据在 身份验证票证

DAL

负载均衡

  • 利用反向代理,以在您的应用程序实例传播客户端负载。 (堆栈溢出使用HAProxyMSDN)。

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

客户端

  • 优化您的客户端,使用工具如YSlow对于 提高性能的建议
  • 使用AJAX更新UI的组件,尽可能避免整个页面更新。
  • 考虑实施pub-sub架构 - 即。 Comet-针对内容传输,基于超时重新加载 。
  • 如果可能的话,将图表和图表生成逻辑移动到客户端。图表生成 是一个昂贵的活动。将服务器从 不必要的负担延迟到客户端,并且允许您在本地使用图形,而无需发出新的 请求(即Flex图表,jqbargraphMoreJqueryCharts)。
  • 使用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">
+6

等你意味着我失去了表现,当我例如有一个视图通过IList激怒并显示结果集,并为每个列表项调用Render.PartialView(“Row”,item)?我输了多少?或者我怎么测量性能增益? – 2010-02-12 15:03:33

+0

@SDReyes - ** pub-sub架构**的含义是什么? – xameeramir 2015-11-26 06:18:33

+0

这很酷。 Uber Profiler链接已经死了。这应该与其中一个ORM特定的分析器链接吗? – shanabus 2016-12-07 19:57:02

6

不是一个惊天动地的优化,但我想我会把它扔到那里 - Use CDN's for jQuery, etc.

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

我们甚至在使用jQuery的Moss的web部件中使用CDN。

10

的基本建议是遵循REST principles及以下几点捆绑一些校长到ASP.NET MVC框架:

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

Code Climberthis blog entry提供了提高应用程序性能的详细方法。

编译查询会提高应用程序的性能,但它与ASP.NET MVC没有任何共同之处。它会加速每个数据库应用程序,所以它不是真的关于MVC。

6

另外,如果您使用NHibernate,则可以打开并为查询设置第二级缓存并添加到查询范围和超时。并且有EF,L2S和NHibernate的踢屁股分析器 - http://hibernatingrhinos.com/products/UberProf。这将有助于调整您的查询。

+0

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

4

除了在服务器端优化您的应用程序的所有优秀信息,我会说你应该看看YSlow。这是提高客户端网站性能的极好资源。

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

3

一件非常容易的事就是在访问页面所需的数据时进行异步思考。无论是从Web服务,文件,数据库还是其他内容读取,都尽可能使用异步模型。虽然它不一定能帮助任何一个页面加快速度,但它会帮助您的服务器更好地执行整体。

7

这看起来很明显,但在发布模式下运行您的站点,而不是在调试模式下,在生产环境中以及性能分析过程中。发布模式是多了更快。调试模式可以隐藏自己的代码中的性能问题。

3

我也将增加:

  1. 使用精灵:精灵是减少请求一个伟大的事情。您将所有图像合并为一个图像,然后使用CSS获得精灵 的一部分。微软提供了一个很好的库: 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 网站)。

+0

你认为运行一个返回更多结果集的存储过程更好,然后以异步模式运行更多的存储过程会更好吗? – Muflix 2016-08-09 16:57:09

2

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视图中的数据访问代码没有一个很好的理由。如果我没有看到它,我不会说这个。他们已经在将模型放在一起时访问他们的数据,为什么他们不把它们包括在模型中?

1

在你闹着要优化客户端,不要忘了数据库层。我们有一个应用程序从5秒开始,在一夜之间加载到50秒。

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

1
  1. 实现Gzip已。
  2. 对部分视图使用异步渲染。
  3. 最小化数据库命中。
  4. 使用已编译的查询。
  5. 运行一个分析器并找出不必要的命中。优化所有超过1秒钟的存储过程以返回响应。
  6. 使用缓存。
  7. 使用bundling minification优化。
  8. 使用HTML 5实用程序(如会话高速缓存和本地存储)来实现只读内容。
0

以下是要做的事情

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

使用捆绑和缩小也有助于提高性能。它基本上减少了页面加载时间。

2

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

我们大多数人或多或少知道网址是如何在我们的应用程序产生的,无论如何,单纯用静态Url.Content("~/Blahblah")代替Url.Action()Url.RouteUrl()在可能情况下,通过近20倍,甚至更击败所有其他方法。

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