Answers:
可能的改进来源的汇总列表如下:
一般
快取
CompiledQuery.Compile()
递归使用避免重新编译查询表达式OutputCacheAttribute
以节省不必要的操作执行ActionResult
必要时编写自定义方法RouteName
来组织您的路线,然后使用它来生成链接,并尽量不要使用基于表达式树的ActionLink方法。PartialViews
,避免渲染xxxx次:如果最终在同一视图中调用了相同的部分300次,则可能是有问题的。解释和基准路由
使用Url.RouteUrl("User", new { username = "joeuser" })
指定的路线。Rudi Benkovic的ASP.NET MVC性能
使用此助手ASP.NET MVC Perfomance解决缓存路由问题UrlHelperCached
,作者:Rudi Benkovic
安全
DAL
负载均衡
客户端
全局配置
如果使用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>
<pages buffer="true" enableViewState="false">
基本建议是遵循REST原则,以下几点将其中一些原则与ASP.NET MVC框架联系起来:
Code Climber和此博客条目提供了提高应用程序性能的详细方法。
编译查询将提高应用程序的性能,但与ASP.NET MVC没有任何共同之处。它将加快每个数据库应用程序的速度,因此它与MVC无关。
这看起来似乎很明显,但是在生产中以及性能分析期间,以发布模式而不是调试模式运行站点。释放模式要快得多。调试模式可以在您自己的代码中隐藏性能问题。
通过LINQ访问数据时,请依赖IQueryable ...
...并利用良好的存储库模式:
这将优化数据访问,以确保仅在需要时加载所需数据。
这不是一个破天荒的优化,但我想我应该把它扔掉- 将CDN用于jQuery等。
引用ScottGu本人的话:Microsoft Ajax CDN使您能够显着提高使用ASP.NET AJAX或jQuery的ASP.NET Web窗体和ASP.NET MVC应用程序的性能。该服务是免费提供的,不需要任何注册,并且可以用于商业和非商业目的。
我们甚至在使用jQuery的Moss中将CDN用于我们的Web部件。
另外,如果您使用NHibernate,则可以打开并设置二级缓存进行查询,并添加到查询范围和超时中。还有用于EF,L2S和NHibernate的踢屁股分析器-http: //hibernatingrhinos.com/products/UberProf。这将有助于调整您的查询。
我还将添加:
使用Sprites:Sprites是减少请求的好方法。您将所有图像合并到一个图像中,并使用CSS来获取精灵的大部分。Microsoft提供了一个很好的库来做到这一点: Sprite和Image Optimization Preview 4。
缓存您的服务器对象:如果有一些引用列表或数据很少更改,则可以将它们缓存到内存中,而不是每次都查询数据库。
使用ADO.NET而不是Entity Framework:EF4 or EF5
可以减少开发时间,但是优化起来很麻烦。优化存储过程比实体框架更简单。因此,您应尽可能使用存储过程。Dapper提供了一种查询和映射SQL的简单方法,性能非常好。
缓存页面或部分页面:MVC提供了一些简单的过滤器来根据某些参数缓存页面,因此可以使用它。
减少数据库调用:您可以创建一个唯一的数据库请求,该请求返回多个对象。检查Dapper网站。
始终拥有干净的体系结构:即使在小型项目中,也要拥有干净的n层体系结构。它可以帮助您保持代码的清洁,并且在需要时可以更轻松地对其进行优化。
您可以看一下该模板“ Neos-SDI MVC模板 ”,它将为您创建一个干净的体系结构,默认情况下具有许多性能改进(请 访问MvcTemplate网站)。
除了在服务器端优化应用程序的所有重要信息之外,我还想说您应该看看YSlow。这是用于改善客户端网站性能的绝佳资源。
这适用于所有站点,而不仅仅是ASP.NET MVC。
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视图中使用数据访问代码。如果我没有看过我就不会说这个。他们在将模型放在一起时已经在访问数据,为什么他们不将数据包括在模型中呢?
以下是要做的事情
如果要在Microsoft Azure(IaaS或PaaS)上运行ASP.NET MVC应用程序,则至少在第一次部署之前执行以下操作。
我做了上面所有的回答,但并没有解决我的问题。
最后,我通过在发布配置文件中设置PrecompileBeforePublish解决了网站加载缓慢的问题以真实的。如果要使用msbuild,可以使用以下参数:
/p:PrecompileBeforePublish=true
确实有很大帮助。现在,我的MVC ASP.NET加载速度提高了10倍。