rud*_*dib 15 c# performance asp.net-mvc-routing
ASP.NET MVC的一个小基准.查看页面代码:
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/>";
}
Run Code Online (Sandbox Code Playgroud)
查看代码:
<%= 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")) ) %>
Run Code Online (Sandbox Code Playgroud)
使用ASP.NET MVC Beta在默认新项目模板上的典型Core2笔记本上运行此命令会产生以下结果:
38 ms,每个链接0,038 ms
120 ms,每个链接0,12 ms
54 ms,每个链接0,054 ms
在具有大约10个控制器的生产项目上运行相同的基准测试,这些控制器总共包含大约100个方法和30个路由表条目,对于基于表达式的方法,性能大大降低:
31 ms,每个链接0,031 ms
每个链路112毫秒,0,112毫秒
每个链路450毫秒,0.45毫秒
我们使用这种方法(可维护性)并进行一些性能基准测试,这大大降低了网站的性能 - 页面快速包含大约30个或更多这样的链接,这意味着单个页面上10ms的额外开销.即使每个URL 0.112ms也只有4ms的纯CPU开销.
值得注意的是,MVC Preview 3和Beta(昨天发布)之间所有三个URL生成调用的性能提高了5倍.
Stack Overflow应该由相同的框架提供支持,你们如何解决这个扩展问题?首页的自由缓存(许多链接)和预渲染控件?
ASP.NET MVC中的任何其他生产网站都存在性能问题或一些好的提示?
缓存链接对于团队来说可能是一个很好的建议,因为它们在进程的生命周期内不会改变(无论如何对于大多数应用程序来说)。
在您开始以可配置的形式(例如 web.config 或在数据库中)定义路由之前,您必须稍微缩减规模。
我怀疑中间示例的延迟的很大一部分是自动转换为字典的匿名类型。缓存 URL 在这里没有帮助,因为您仍然需要反映该类型。
同时,您可以为某些基于字典的链接创建您自己的帮助器方法,这些链接将获取您所需的确切输入。然后你可以自己处理缓存。