ASP.NET MVC 3 Razor 性能优化

64

重要更新:请查看底部的更新 5,Asp.net MVC 3 中没有性能问题,这是一个基准问题

我在 asp.net mvc2、3 aspx 和 3 razor 中创建了一个简单的 hello world 项目,并对它们进行了基准测试。我所看到的是:

System                  Requests per second
-------------------------------------------
asp.net mvc 2 ASPX                     4200
asp.net mvc 3 Beta 1 ASPX              3200
asp.net mvc 3 Beta 1 Razor             1700

为什么razor这么慢?

更新:我重新进行了测试。所有4个测试虚拟目录都使用相同的.net 4集成模式应用程序池。所有项目都使用添加新的空x项目并添加1页带有1行文本且没有代码的方式完成。所有站点都以发布模式编译。我的系统是Windows 7,4个GB i7 4个内核。我运行了测试2次来预热IIS,这些是第二次运行的结果。Apache Bench参数:ab -n100000 -c1000 结果:

System         Requests per second   CPU Utilization
----------------------------------------------------
asp.net 4                     4780               43%
mcv 2                         4322               58%
mvc 3 beta 1 aspx             2324               54%
mvc 3 beta 1 razor            1615               54%

更新2 Scott Guthrie在他的博客中回答道:

我们还没有完全优化MVC3(通常有很多缓存调整需要进行)。在最终发布之前,我们预计Razor与.aspx视图引擎的性能相同。

System         Requests per second   CPU Utilization
----------------------------------------------------
mvc 3 rc1 razor               1960               54%
mvc 3 rc2 razor               2187               54%
mvc 3 rc2 aspx                4014               58%

更新5: 所有测试都在发布模式下完成,但问题出在我的 web.config 文件中的 debug="true"(这也会影响发布版)。将其改为 false 后,问题得以解决。有趣的是,它只会影响到这个规模下的 razor 模板。在部署时应该注意这一点。

System         Requests per second   CPU Utilization
----------------------------------------------------
mvc 3 rc2 razor               3940               58%
mvc 3 rc2 aspx                4100               58%

多亏了 asp.net mvc 团队,做得非常棒!


10
你是如何进行基准测试的?你的网站是否以发布模式部署在IIS上?你是否在machine.config中使用了<deployment retail="true" />部分?此外,请记住,ASP.NET MVC 3仍在积极开发中,因此不能期望它已经完全优化。至少等待它达到RTM版本。 - Darin Dimitrov
1
你能在MVC3中禁用旧的ASPX ViewEngine吗?我记得在某个地方读到过,多个ViewEngines在MVC2中会导致性能问题,也许这个问题在MVC3中仍然存在,并且这种开销是问题的一部分?发现这一点将非常有趣! - mnemosyn
2
我看到你在Phil Haack的博客上提出了与RC2相关的问题。我们进行了一些重要的性能优化,因此您的数字应该会有所改善。您可以尝试使用新版本进行构建吗? - marcind
@marcind:我更新了基准测试。在使用剃刀模板时存在问题。我有一个只有1行字符串的剃刀页面。在同一测试中,当我将文件扩展名更改为aspx时,性能提高了两倍,可以在我的更新中看到,很有趣。 - sirmak
以新答案的形式发布响应,因为RC2位几乎就是RTM将要成为的内容。 - marcind
显示剩余3条评论
2个回答

26

感谢提供更新的数字。以下是几点说明:

  1. 您的Aspx数字看起来不错,我们认为MVC3 Aspx应该与MVC2 Aspx相当(在这个Hello World示例中稍微慢一点是可以预期的)。
  2. 您的Razor数字看起来可疑。我们知道Razor比等效的Aspx略慢,但差距应该不超过5%-7%。您的数字表明它慢了50%,这与我们的结果根本不符。请检查项目是否以Release方式编译,并确保web.config中设置了debug="false"
  3. 您的CPU利用率有些可疑。使用1000个并发请求时,CPU利用率应为100%。(即使只有8个并发请求也足够,因为您有8个虚拟核心)
  4. 您的测试运行时间大约在20-25秒左右。这有点短,因为系统其他地方的短暂(1-2秒)活动可能会对您的结果产生相当大的影响。
  5. 关于第4点,您每个场景只运行了一次还是运行了几次?您是否看到结果有很大的变化?由于操作系统正在后台执行其他任务,因此多次运行通常会得到不同的结果。

非常感谢Marcind,#2解决了问题。我已经在所有测试中以发布模式编译,但是没有在web.config中设置debug=true。将其设置为false解决了问题。我正在更新我的问题并在haacked的博客上发表评论。在这个更改之后,Razor中的rpc是3940。 - sirmak
3
没问题。在测量性能时你必须小心。 - marcind

19
你是如何进行基准测试的?你的网站是否以发布模式在IIS上部署?你使用了machine.config中的部署小节<deployment retail="true" />吗?请记住,ASP.NET MVC 3仍在积极开发中,因此您不能期望其完全优化。至少等到它发布RTM版本。

1
@sirmak,我们知道当前Beta版本存在某些性能问题。您是否针对所有3个配置重新运行了测试,还是只在MVC 3上运行了Razor(如果机器负载不同,则运行可能无法比较)。您的测试应用程序是否真的只是一个简单的Hello World页面?考虑到当您有一个非常简单的页面时,渲染所花费的时间相对较少,我觉得Razor和ASPX之间的差异如此之大令人惊讶。 - marcind
这只是一个简单的“Hello World”测试,对于Razor,4核i7的CPU使用率约为40%。我记不得aspx的CPU使用率了。我在Windows 7上以相同的条件运行所有测试,并且样本应用程序都是空项目。我将为所有内容进行全新的测试,并向您提供更多详细信息。 - sirmak
我建议运行一些更复杂的示例。这可能会使事情看起来更加均匀或不均匀,但至少会更加真实。 - Michael Haren
@Michael:一个只有一个控制器和一个页面的空项目,显示了系统的最小开销,在我看来,我的基准测试没有问题。 - sirmak
@sirmak,我建议您通过添加一个复杂的示例来补充此内容。视图引擎可能无法按预期扩展。 - Michael Haren
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接