ASP.NET MVC URL生成性能

与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/>";
    }

查看代码:

<%= 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")) ) %>

在带有ASP.NET MVC Beta的默认新项目模板上的典型Core2笔记本上运行此结果会产生以下结果:

38毫秒,每个链接0.038毫秒

每个链接120毫秒,0,12毫秒

54毫秒,每个链路0,054毫秒

使用大约10个控制器在生产项目上运行相同的基准测试,这些控制器共有大约100个方法和30个路由表条目,因此基于表达式的方法性能会大大降低:

31 ms,每个链路0,031 ms

112 ms,每个链路0,112 ms

450毫秒,每个链接0.45毫秒

我们使用这种方法非常多(可维护性),并进行了一些性能基准测试,这极大地降低了网站的性能 - 网页很快包含大约30个或更多这样的链接,这意味着单页上的额外开销为10毫秒。 即使每个URL有0.112ms,纯CPU的开销也只有4ms。

应该注意的是,MVC Preview 3和Beta(昨天发布)之间的所有三个URL生成调用的性能得到了5倍的提升。

堆栈溢出应该是由相同的框架支持,你们如何解决这个缩放问题? 首页的自由缓存(大量链接)和预渲染的控件?

在ASP.NET MVC的任何其他生产网站的性能问题或一些很好的提示?


我在MS论坛上问了这个问题,这个问题从MS MVC开发者那里得到了答案。

帖子

答案

从MVC预览版2到最近刚刚发布的MVC Beta版本,对路由进行了很多更改。 其中一些变化包括性能改进。 这里有一些技巧可以让您的应用程序更高效地生成URL:

  • 使用命名路线。 命名路线是路由的可选功能。 这些名称仅适用于URL生成 - 它们从不用于匹配传入的URL。 当您在生成URL时指定名称时,我们只会尝试匹配该路线。 这意味着即使您指定的指定路线是路线表中的第100条路线,我们也会直接跳到该路线并尝试匹配。

  • 将最常用的路线放在路线表的开头。 这将改善URL生成的性能以及处理传入的URL。 路由根据第一场比赛胜出的规则进行工作。 如果第一场比赛是您的路线表中的第100条路线,那么这意味着它必须尝试99条其他路线并且它们都不匹配。

  • 不要使用URL生成。 有些人喜欢它,有些人却不喜欢。 掌握有点棘手。 如果您的网址非常具有动态性,那么使用它非常好,但如果您的网址很少,可能会有点麻烦,也许您并不关心它们的样子。

  • 我最喜欢的选择是#1,因为它使用起来非常简单,并且从应用程序开发人员的角度(这就是你!)也使URL生成更具确定性。


    缓存链接对于团队来说可能是一个很好的建议,因为它们在整个过程中不会改变(对于大多数应用程序而言)。

    在开始以可配置的形式(例如web.config或数据库)定义路由之前,您必须缩减一点。

    我怀疑中间示例中的很大一部分延迟是自动转换为字典的匿名类型。 缓存网址在这里无法帮助你/你仍然需要反映这种类型。

    与此同时,您可以为一些基于字典的链接创建自己的帮助器方法,这些链接将采用所需的确切输入。 然后你可以自己处理缓存。


    好的,关于空白模板项目的其他两个指标:

    <%= Bechmark(() => Url.Action("Login", "Account", new Dictionary<string, object> {{"username", "bla"}, {"password", "bla2"}, {"returnurl", "blabla32"}, {"rememberme", "false"}})) %>
    
    <%= Bechmark(() => Url.Action("Login", "Account", new RouteValueDictionary(new Dictionary<string, object> {{"username", "bla"}, {"password", "bla2"}, {"returnurl", "blabla32"}, {"rememberme", "false"}}))) %>
    

    结果:

    71毫秒,每个链接0.071毫秒

    35毫秒,每个链路0,035毫秒

    用更方便的代码实现更好的性能。 太糟糕了。

    链接地址: http://www.djcxy.com/p/46531.html

    上一篇: ASP.NET MVC URL generation performance

    下一篇: How to determine number of components per pixel for CGImage?