ASP.NET MVC性能


102

我发现一些疯狂的言论,即ASP.NET MVC比ASP.NET WebForms快30倍。有什么实际的性能差异,已对此进行了测量以及性能优势是什么?

这是为了帮助我考虑从ASP.NET WebForms迁移到ASP.NET MVC。


20
自从WebForms问世以来,他们就合作了。我永远不会回头!MVC窃取了我的<3-这个站点在Beta 5上运行得非常快!
Jarrod Dixon

2
关于此问题的所有修订回滚是什么?
尼克,

@Nick:OP正在回滚所有编辑,并删除解释它们的所有注释。
GEOCHET

@Rich B:是的,他删除了我的大约5条评论。
乔治·斯托克

2
我们即将接近MVC3发行版,因此需要更新。
安德鲁·刘易斯

Answers:


69

我们没有执行得出任何结论所必需的可伸缩性和性能测试。我认为ScottGu可能一直在讨论潜在的绩效目标。随着我们向Beta和RTM迈进,我们将在内部进行更多的性能测试。但是,我不确定发布perf测试结果的政策是什么。

无论如何,任何此类测试确实都需要考虑实际应用程序。


13
现在已经发布了MVC,是否有任何关于更新性能结果的更新?
克里斯,

6
只是投票赞成,因为之前的5999 rep分数伤害了我的眼睛:(
Damien

2
到这个时候,您一定要有一些数字。想要更新您的答案吗?还是您发现讨厌的政策禁止这样做?
tvanfosson

7
这个数字是42。:)通常,我们的数字可能对现实应用没有用,因此通常我们不公开它们。但是,我知道Microsoft的其他团队正在建立大型网站,这些网站显示出令人满意的数字。换句话说,与框架中的任何继承问题相比,任何性能问题都更可能是由于程序员的错误造成的。通常,与数据库和外部服务的交互是元凶。:)
Haacked

真正!请更新此!也许不是基准,而是一个简短的主意,它们是同等的,还是mvc在性能方面稍好一点?
gideon

48

我认为这将是一个很难回答的难题,因为很大程度上取决于A)如何实现WebForms应用程序,以及B)如何实现MVC应用程序。以其“原始”形式,MVC可能比WebForms更快,但是多年的工具和经验已经产生了许多用于构建快速WebForms应用程序的技术。我愿意打赌,一个高级ASP.NET开发人员可以生产可以与任何MVC应用程序速度匹敌的WebForms应用程序,或者至少可以忽略不计。

正如@tvanfosson所建议的,真正的区别在于可测试性和干净的SoC。如果您最关心的是提高性能,那么我认为这不是迁移WebForms并开始在MVC中重新构建的重要理由。至少直到您尝试过用于优化WebForms的可用技术为止。


很好的答案Todd(对于开发人员的传播者实际做出务实的回应是多么令人惊讶)。您唯一犯错的地方是原始实现的Webform确实确实快得多。
克里斯·马里西奇

42

仅通过消除viewstate并使它在编程上可承受与提交的输出一起使用,就将我的页面从2MB有效负载减少到200k。

即使处理是相同的,单独的大小也将极大地提高每秒的连接数和请求速度。


31
您也可以在没有MVC的情况下修复令人讨厌的大
视角状态

1
只是为了详细说明,可以在页面级别或在web.config中关闭ViewState
bbqchickenrobot,2010年

8
是的,但是在mvc中,这是一个明智的默认选择,不是一项设计决定,该决定迫使您离开所有控件以及声称只在Web表单上工作的供应商,方法是通过移走Web表单的“后腿”使其“行为失常”。我不同意您可以重新编码该页面,但是如果没有viewstate,整个应用程序会更好。
DevelopingChris

那么您不认为将整个应用程序移植到MVC而不是在web.config中关闭viewstate是您最糟糕的决定吗?不,viewstate不是主干。仅当您进行研究后,viewstate才能保留在缓存中,也可以保留在会话中。
资深会员

29

我认为许多认为WebForms本质上很慢或占用大量资源的人都将责任归咎于错误的位置。当我被引入优化Webforms应用程序时,十分之九的情况是,应用程序的作者在太多地方误解了viewstate的目的。我并不是说viewstate是完美的或任何东西,但是滥用它实在太容易了,正是这种滥用导致了viewstate字段膨胀。

这篇文章对帮助我了解许多此类滥用无价。https://weblogs.asp.net/infinitiesloop/truly-understanding-viewstate

为了在MVC和WebForms之间进行有效的比较,我们需要确保两个应用程序都正确使用了体系结构。


14

我的测试显示,在MVC上,req / sec的响应速度提高了2到7倍,但这取决于您构建Webforms应用程序的方式。仅带有“ hello world”文本,没有任何服务器端控制,mvc的速度提高了约30-50%。


12

对我来说,MVC真正的“性能”改进是增加了应用程序的可测试范围。有了WebForms,很多应用程序很难进行测试。使用MVC,可测试的代码量基本上翻了一番。基本上,所有不容易测试的是生成布局的代码。您的所有业务逻辑和数据访问逻辑-包括填充视图中使用的实际数据的逻辑-现在都可以进行测试。虽然我希望它也能有更好的性能-页面生命周期被大大简化并且更适合Web编程-即使它相同或稍慢,从质量的角度来看,还是值得切换的。


我真的很想知道为什么有人拒绝了这个答案。
tvanfosson

我的感觉是,它可能会被否决,因为设计良好的ASP.NET Web窗体应用程序与MVC应用程序一样可测试。我开发这两种软件的经验是,MVC会迫使您进入一个干净的编程模型(这是它的最大优点之一,IMO)。Web表单可以让您做得更懒惰,但是仍然有可能在Web表单中拥有相同的可测试表面。无论如何,这就是我的猜测。
dudemonkey

剃刀视图从字面上鼓励在视图中嵌入代码。这是不可测试的,并且对于分离关注点来说并不是一个好兆头。仅仅因为MVC使您能够编写控制器,并不意味着如果您不知道自己在做什么,就无法搞定一切。熟练的开发人员将从WebForms(或更多)获得的性能与MVC一样多,并且具有几乎相同的“可测试表面”。
理查德·豪尔

@RichardHauer在我写这篇文章时确实不正确,但是他们对此有所改进。由于WebForms在.NET Core中似乎没有前途,因此这似乎是一个有争议的话题。
tvanfosson's

@tvanfosson同意-现在讨论。不确定您认为哪一点不正确,也许您反对我对“字面意思”的使用?无论如何,带有TagHelpers的MVC的较新版本确实有助于消除将代码放到布局中的习惯,这最终可能对我来说都起作用。当然,赞赏这篇文章已经很久了,但是即使在那时,一个构造良好的WebForms表单也非常快,没有MVC的“魔术连接”,也没有在视图中嵌入任何代码。
理查德·豪尔

7

我认为这里的问题是,无论ASP.Net MVC比旧的Webforms快多少,它都不会起作用,因为大部分时间都在数据库中。大多数情况下,您的Web服务器将在数据库服务器上等待0-10%的CPU使用率。除非您在网站上获得大量点击,并且数据库非常快,否则您可能不会注意到很大的不同。


您的用户可能-没有viewstate。
2009年


3

与公认的观点相反,就原始性能而言,优化的Web窗体用法完全杀死了MVC。Webforms已针对服务html的任务进行了超优化,远远超过了MVC。

可在http://www.techempower.com/benchmarks/#section=data-r7&hw=i7&test=db上获得指标

每个单独的比较mvc都位于列表的中低/上-上排名中,而优化的Webforms使用情况位于中高/上/-下排名中。

对这些指标的轶事但非常认真的验证,www.microsoft.com由Webforms而非MVC提供。这里有没有人相信如果凭经验更快,他们不会选择MVC吗?


2

确实没有办法回答。MVC默认情况下默认使用Web窗体视图引擎,并且可以配置为使用任意数量的自定义视图引擎,因此,如果要进行性能比较,则必须更加具体。


2

大约一年前,我开始在MVC中工作,但受到启发但没有留下深刻的印象。

我讨厌视图状态,并认为它是ASP.NET的万恶之源。这就是为什么我只是不使用它,而老实说你为什么呢?

我基本上采用了ASP.NET MVC框架的概念,并以自己的方式构建了该概念。我还是改变了几件事。我围绕动态重新编译构建了控制器包装代码或URL路由代码。

现在,我要说的是,根据您的使用方式,ASP.NET MVC应用程序将更快。如果您完全放弃WebForms,您会更快,因为ASP.NET的生命周期和对象模型非常庞大。

在编写时,您是在实例化一支军队……别等,一大批对象将参与视图的渲染。这比在ASPX页面本身中表达最少行为的速度要慢。(我不在乎视图引擎的抽象,因为在Visual Studio中对ASPX页面的支持是不错的,但是由于代码膨胀或无法更改WebForms,我已经完全放弃了WebForms的概念,基本上已经放弃了任何ASP.NET框架。连接我的应用程序的东西)。

我发现了依靠动态重新编译(System.Reflection.Emit)来在需要时发出特殊目的对象和代码的方法。该代码的执行比反射更快,但最初是通过反射服务构建的。这不仅使我的MVC风格的框架具有出色的性能,而且还具有非常静态的类型。我不使用字符串和名称/值对集合。取而代之的是,我的自定义编译器服务将重写表单发布到传递给引用类型的控制器操作中。幕后发生了很多事情,但是此代码速度很快,比WebForms或MVC框架快得多。

另外,我不写URL,而是写lambda表达式,这些表达式被转换为URL,这些URL以后可以告诉调用哪个控制器动作。这不是特别快,但是可以避免URL损坏。就像您拥有静态类型的资源以及静态类型的对象一样。静态类型的Web应用程序?那就是我想要的!

我鼓励更多的人尝试一下。


2
因此,这不是问题的直接答案吗?但是它是相关的,并且有两个优点。但是,嘿,这是我为自己的需要而建造的,非常适合我。我也很喜欢分享我的想法,即使很少有人知道原因。
约翰·莱德格伦

1
好吧,您不必更改投票,但也不必对此投反对票,因为这不是“答案”。如果花一点时间看一下文本,有几件事表明ASP.NET MVC比WebForms更快,为什么会这样。它归结为诸如反射,WebForms的对象模型和ViewState开销之类的事情。
约翰·莱德格伦

@John-现在MVC2具有改进的模型绑定,验证,强类型帮助器等功能,与您的方法相比,您如何评价它?
tvanfosson

MVC2更好,我相信它已经取代了我当时所构建的产品(在Beta版中使用了MVC1)。与我尝试在不选择现有工具的情况下基于ASP.NET构建的问题相比,我遇到了很多麻烦。可以说,我学到了很多东西,最终将其投入生产。我现在意识到,当前的工具/框架(VS / ASP.NET / C#)并不适合这些东西,最终,如果您想走这条路,则需要投资于自己的编译器/模型检查一些东西对你有利。
约翰·莱德格伦

当时,我对ASP.NET MVC的使用并不多。它缺少我知道我想要的东西。但是,我不得不花费大量时间来开发,测试和解决这些问题。我仍然认为,就此而言,我正在构建的Web框架的静态方面优于MVC,但C#编译器无法解决该问题。您需要某种语言/编译器,以便在元编程时具有更大的灵活性。我必须在运行时执行很多操作,并且通常不可能缓存已编译的实例,因此我不得不动态地重新编译很多东西。
John Leidegren 2010年

2

使用Visual Studio创建的项目。一个是mvc4模板,另一个是WebForm(传统)。当使用WCAT进行负载测试时,这就是结果,

MVC4比WebForms慢很多,有什么想法吗?

在此处输入图片说明

MVC4

  • 可以得到大约11 rps
  • 无论是2-cpu还是4-cpu服务器,rps都非常低

在此处输入图片说明

WebForms(aspx)

  • 可以达到2500 rps以上

  • 已经发现性能杀手是MVC Bata或RC的错误。一旦我删除了Bundles的东西,性能就会得到改善。现在,最新版本已解决此问题。


1

性能取决于您在做什么...通常,MVC比asp.net更快,这主要是因为缺少Viewstate,并且默认情况下,MVC与Callback的合作比与Postback的合作更多。

如果优化您的Webform页面,您可以具有与MVC相同的性能,但这将需要很多工作。

此外,它们是MVC(以及Webform)的许多细节,可以帮助您改善网站性能,例如组合和最小化CSS和javascript,对图像进行分组并将其用作sprite等。

网站的性能在很大程度上取决于您的体系结构。具有良好关注点分离的干净代码将为您带来更干净的代码,以及如何提高性能的更好的主意。

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


-1

在此处输入图片说明

我用一些基本代码做了一个小的VSTS负载测试实验,发现ASP.NET MVC的响应时间是ASP.NET Webforms的两倍。上面是带有该图的附图。

您可以从此CP文章中详​​细阅读此负载测试实验 https://www.codeproject.com/Articles/864950/ASP-NET-MVC-vs-ASP-NET-WebForm-performance-compari

使用VSTS和telerik负载测试软件,按照以下规格进行了测试:

用户负载25位用户。

测试的持续时间为10分钟。

机器配置DELL 8 GB Ram,Core i3

项目托管在IIS 8中。

项目是使用MVC 5创建的。

假定网络LAN连接。因此,此测试暂时不解决网络延迟问题。

在测试中的浏览器中选择了Chrome和Internet Explorer。

在测试过程中进行多次读取以平均未知事件。本文取了7个读数,所有读数都以读数1、2等形式发布。


您的测试方法很差,而且有很大的偏见,并且您的结论无效。正确构建的WebForms应用程序是可测试的,具有适当的关注点分离,并且有效负载开销最小。虽然MVC没有页面生命周期事件循环,但是它具有路由和视图执行方面的问题。您关于CP的此主题的文章有很大的偏见。
理查德·豪尔

即使使用最差的技术,正确而精心构建的应用程序也可以创造奇迹。与路由和视图执行相比,ASP.NET页面生命周期肯定具有更多的有效负载,因为它可以处理HTML UI生成。路由是ASP.NET框架的一部分,因此即使在普通的Web表单中,路由也确实存在。如果您不编写性能落后的代码,我同意的一件事将等同于MVC。但是Webform工具箱如此诱人,以至于其背后的代码成为其不可或缺的一部分。虽然MVC根本不允许我这样做。我喜欢他们在剃须刀上禁用了后面的设计视图和代码。
Shivprasad Koirala
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.