一个使用ASP.NET MVC进行的小型基准测试。Viewpage代码:
public string Bechmark(Func<string> url)
{
var s = new Stopwatch();
var n = 1000;
s.Reset();
s.Start();
for (int i = 0; i < n; i++)
{
var u = url();
}
s.Stop();
return s.ElapsedMilliseconds + " ms, " + ((s.ElapsedMilliseconds) / (float)n) + " ms per link<br/>";
}
查看代码:
<%= Bechmark(() => Url.Action("Login", "Account")) %>
<%= Bechmark(() => Url.Action("Login", "Account", new {username="bla", password="bla2", returnurl="blabla32", rememberme=false} )) %>
<%= Bechmark(() => Html.BuildUrlFromExpression<AccountController>(a=>a.ChangePassword("bla", "bla", "ya")) ) %>
在典型的Core2笔记本电脑上以ASP.NET MVC Beta默认新项目模板运行此代码,结果如下:
38毫秒,每个链接0.038毫秒
120毫秒,每个链接0.12毫秒
54毫秒,每个链接0.054毫秒
在一个包含大约10个控制器、总共约100个方法和30个路由表条目的生产项目上运行相同的基准测试时,基于表达式的方法性能显著降低:
31毫秒,每个链接0.031毫秒
112毫秒,每个链接0.112毫秒
450毫秒,每个链接0.45毫秒
我们经常使用这种方法(可维护性),并进行了一些性能基准测试,但这严重降低了网站的性能——页面很快就会包含大约30个或更多的这样的链接,这意味着单个页面上额外开销约为10毫秒。即使每个URL的0.112毫秒也是约4毫秒的纯CPU开销。
需要注意的是,在MVC Preview 3和Beta(昨天发布)之间的所有三个URL生成调用的性能都得到了5倍的提高。
据说Stack Overflow也是由同一框架驱动的,你们是如何解决这个扩展问题的?大量缓存前端页面(有很多链接)和预渲染控件吗?
还有其他在ASP.NET MVC中存在性能问题或有些好技巧的生产网站吗?