ASP.NET MVC URL 生成性能

2024-01-30

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 毫秒,每个链路 0,031 毫秒

112 毫秒,每个链路 0,112 毫秒

450 毫秒,每个链路 0.45 毫秒

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

应该指出的是,MVC Preview 3 和 Beta(昨天发布)之间所有三个 URL 生成调用的性能都提高了 5 倍。

Stack Overflow 据说是由相同的框架提供支持的,你们是如何解决这个扩展问题的?自由缓存首页(大量链接)和预渲染控件?

ASP.NET MVC 中的其他生产网站是否存在性能问题或一些好的提示?


我在 MS 论坛上问了这个问题,得到了 MS MVC 开发人员的回答。

The post http://forums.asp.net/t/1335585.aspx

答案

从昨天的 MVC Preview 2 到最近发布的 MVC Beta,路由发生了很多变化。其中一些变化包括性能改进。以下是一些提高应用程序中 URL 生成性能的技巧:

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

  2. 将最常用的路由放在路由表的开头。这将提高 URL 生成以及处理传入 URL 的性能。路由基于第一场比赛获胜的规则进行。如果第一个匹配是路由表中的第 100 条路由,则意味着它必须尝试其他 99 条路由,但没有一条匹配。

  3. 不要使用 URL 生成。有些人喜欢,有些人不喜欢。掌握起来有点困难。如果您的 URL 非常动态,那么使用它会很好,但如果您一开始的 URL 很少,并且您可能不关心它们到底是什么样子,那么它可能会有点麻烦。

我最喜欢的选项是#1,因为它非常易于使用,而且从应用程序开发人员(即您!)的角度来看,它还使 URL 生成更具确定性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC URL 生成性能 的相关文章

随机推荐

  • char 的 a += b 运算符的实现与 a = a + b 相同吗? [复制]

    这个问题在这里已经有答案了 发现一个有趣的问题 以下代码运行时会产生不同的结果 char c a c a passed c c a Cannot implicitly convert type int to char An explicit
  • Discord.py - 使用命令更改前缀

    我想创建一个命令 管理员可以更改命令的前缀 例如 他们可以将其更改为 而不是使用 并且只有 才能工作 我可以设置只有管 理员才能使用该命令的权限 我环顾四周 通过文档和互联网 但没有找到任何东西 而且我不知道如何做到这一点 您应该使用com
  • 将片段添加到列表视图项中

    我想为列表视图中的每个项目都有一个片段 因为我想分离出一些逻辑 我为每个项目使用一个视图持有者 如果视图不存在 我将创建一个新片段并将其添加到容器中 holder mMyFragment new MyFragment mActivity t
  • SQL Server:如何检查字段是否具有“NULL”或“NOT NULL”约束?

    谁能告诉我是否有一种方法可以以编程方式确定 Micorosft SQL Server 数据库表字段是否具有 NULL 或 NOT NULL 约束 我需要这个 以便我可以部署一个可以安全重新运行的补丁 所以我正在寻找这样的东西 概念 伪代码
  • HiltAndroidApp/HiltViewModel IDE 中的“未解析的参考”,但它仍然可以构建而不会出现错误

    所以我按照以下步骤进行操作https developer android com training dependency injection hilt android https developer android com training
  • 将正斜杠替换为双引号内的双反斜杠

    我拼命地尝试替换正斜杠 用双反斜杠括在双引号 but a echo var sed s sed s g 不起作用 我不知道为什么 它总是只替换一个反斜杠而不是两个 When 是您想要替换为的正则表达式的一部分s 替代 命令sed 您可以在命
  • Java Regex - 使用单个美元捕获字符串,但当它有两个连续的美元时则不会

    我已经发布this https stackoverflow com questions 58821727 java regex java util regex search for dollar sign早点问 但这还没有结束 那里适用的所
  • 如何解决500内部服务器错误? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当我使用 ajax 调用时 我收到 500 内部服务器错误 是什么导致了这个问题 如何解决呢 调试 修复和解决来自 Ajax 调用的服
  • 结构一字节对齐与架构的对齐要求冲突?

    我之前发过一个问题here https stackoverflow com questions 13881487 should i worry about the alignment during pointer casting comme
  • Android - 使用我的应用程序打开 Gmail 附件

    我需要使用我的应用程序打开具有自定义扩展名的文件 当文件位于我的 SD 卡中时 我可以使用 Intent 过滤器来执行此操作 如果文件作为 Gmail 附件发送 我还可以查看 下载 和 预览 按钮 但是 当我单击下载 预览按钮时 我收到消息
  • 删除某些内容后如何在 OS X Yosemite 上恢复 python?

    我想我之前是通过homebrew安装了python 这不是一个好主意 但我做到了 which python Library Frameworks Python framework Versions 2 7 bin python sudo r
  • 如何在标准 ML 中检查整数的以 2 为底的表示形式? [复制]

    这个问题在这里已经有答案了 我正在尝试在 SML 中实现重复平方算法 我希望它是尾递归的 目标是将所有 x k 相乘 其中 k 是 2 m 2 m 是 n 的二进制表示形式中的 1 例如 对于 x 25 计算 x 1 x 8 x 16 因为
  • 打印两次

    我出于教学目的编写了一个简单的程序 除了打印出名称和您选择的计算答案的部分之外 一切正常 if 语句似乎执行了两次 就好像它在前进之前向后退了一步 它将打印出 您想继续吗 但不会提示用户输入是 否 而是会再次打印出计算的答案 然后询问他们是
  • CodeDom:编译部分类

    我正在尝试编译文本文件中的代码以更改 WinForms 应用程序主窗体上的 TextBox 中的值 IE 将另一个带有方法的分部类添加到调用表单中 该表单有一个按钮 button1 和一个文本框 textBox1 文本文件中的代码是 thi
  • 错误:_handle onLaunch iOS 9 中的特定操作

    我在 iOS 9 上收到以下错误 UIApplication handleNonLaunchSpecificActions forScene withTransitionContext completion unhandled action
  • PHP - 将 MS Word 特殊字符(^l、^p、^s)更改为“,”

    所以我拥有的是一个 MS Word docx 文件 其中包含一些未真正排序的数据 示例输出 1 姓氏 名字 地址 城市 州邮政编码 通过执行 Ctrl Shift 我可以查看文件中存在的所有特殊字符 ETC 然后用 替换它们作为分隔符 然后
  • MDX SSAS - 最大测量日期

    只需要在多维数据集中的所有测量中获取最大日期即可 例如 DateID is a Dimention Measure First Measure Second Measure 如何获取列表MAX DateID 来自我的立方体中的所有措施 以下
  • 处理运行时创建的 OLEObject 命令按钮的事件

    我已经为这个问题苦苦挣扎了一段时间 我想做一些非常简单的事情 我想在运行时创建多个命令按钮 然后用一个过程处理这些命令按钮的事件 所以我构建了一个 withevents 类来处理自动化 但我的代码不起作用 当我运行 Test 时 会创建 C
  • 有没有办法将“a”标签链接取消设置为默认颜色

    我有一个 a 标签 它是另一个网页的正常链接 我想禁用默认链接外观 除非鼠标光标悬停在链接上 此时应恢复默认的正常链接外观 这是我到目前为止所尝试过的 HTML a href example com example a CSS a colo
  • ASP.NET MVC URL 生成性能

    ASP NET MVC 的一点基准测试 查看页面代码 public string Bechmark Func