【问题标题】:Performance knock on using runat=server for html controls使用 runat=server 进行 html 控件的性能提升
【发布时间】:2009-11-13 21:55:18
【问题描述】:

我试着用谷歌搜索这个,结果有点短,所以也许这里有人可以对这个话题有所了解。

为了在 asp.net 中重写 url,我想用 runat="server" 属性声明我的应用程序中的所有图像和其他资源,以利用 "~/images" 服务器路径语法。当使用相对路径(使用 url 重写时)时,在 locahost 上进行调试尤其困难。我知道我可以修改主机文件以在一定程度上克服这个问题,但由于我们从事的项目数量众多,这是不可行的。

向运行服务器声明 html 控件通常会添加到视图状态以启用数据持久性,但这与图像无关,还是我对此有误...?

我也意识到 ASP 网络运行时引擎需要处理和处理的控件更多,但这真的会严重消耗性能吗...?

以这种方式声明图像是否存在严重的开销,如果是这样,有人可以解释大部分性能影响的确切来源。

提前致谢。

【问题讨论】:

    标签: asp.net performance runatserver


    【解决方案1】:

    假设您要求的是:

    1) <img runat="server" EnableViewState="false" src="~/images/img.png" />
    

    2) <img src='<%= ResolveUrl ("~/images/img.png") %>' />
    

    要构建 1),实际生成的代码(或多或少)是:

    System.Web.UI.HtmlControls.HtmlImage __ctrl;
    __ctrl = new System.Web.UI.HtmlControls.HtmlImage();
    this._bctrl_1 = __ctrl;
    __ctrl.EnableViewState = false;
    __ctrl.Src = "~/image.png";
    

    然后那个__ctrl被添加到控制树中:

    __parser.AddParsedSubObject(this._bctrl_1); // _bctrl_1 is __ctrl from above
    

    页面生命周期中的任何事件(Init、Load...)都将传播到该控件,调用 RenderControl 以从中获取 HTML,调用 ResolveUrl() 以获取实际 URL,最后, Dispose() 也会被调用。

    现在,在情况 2) 中,控件不会以正常方式添加到其父级,而是您会得到如下内容:

    __ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.__RenderTree));
    

    它设置了一个在渲染 时将被调用的委托。在 __RenderTree 中写我们感兴趣的标签的部分是:

    __output.Write("\n<img src='");
    __output.Write( ResolveUrl ("~/image.png") );
    __output.Write("' />\n");
    

    所以,是的,有“很多”代码在 1) 中运行,而在 2) 中没有运行。现在,就实际执行时间的影响而言,我认为这没什么大不了的。我测试了一个只有 img 标签/控件的空页面,它们在几次运行中的差异在每个请求的 -0.5ms/+0.5ms 范围内。 完全可以忽略不计

    【讨论】:

    • 正是我想要的...谢谢 :) 从来没有想过选项 2...gg
    【解决方案2】:

    即使假设您已关闭所有视图状态 marlarky,也会产生显着的相对开销。然而,绝对成本对于个人用户来说可能是无法察觉的。

    考虑一个描述一系列 HTML 元素的标记,它被视为一个简单的文字“控件”,它非常有效地将其全部内容发送到页面渲染中适当点的响应。

    将所有相同的元素创建为完整控件与所有对象创建、样式元素的解析、验证等以及本地状态的创建进行比较。然后代码运行以获取本地状态并几乎呈现与最初在 ASP.NET 页面中定义它的相同 HTML 标记。

    显然,就内存和 CPU 而言,使用大量 runat="server" 会更加昂贵。在个别情况下,这可能不是问题,但对于具有大量活动的网站来说,这很可能是问题。

    如果您正在开发的应用程序将被放置在较大站点的某个虚拟目录中,那么请为您的图像使用相对路径。

    如果您正在开发一个应用到它自己的站点的应用程序,那么在项目或站点属性中将 Developer Web Server 类别中的虚拟路径修改为“/”。这样,在调试时,URL 中就没有额外的 /myprojectname/ 部分。这将允许您使用某些资产或图像文件夹的绝对路径。

    【讨论】:

    • 感谢 Anthony 的回复... url 重写和相对路径的问题是位于根目录 /product.aspx?pid=1 的页面可以重写为 /products/productgroup/some -产品.aspx。因此,页面上声明的所有图像和资源将不再有效。其次,我们使用 IIS 进行调试并简单地附加到 w3wp.exe 进程,我们不使用 Web 开发人员服务器,因此也取消了此选项。我理解您所说的关于性能成本的内容,并感谢您提供的信息。我想这取决于网站的性质(流量等......)
    • 如果您正在重写 URL 并且这是一个根站点,那么只需为您的图像使用绝对路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2012-07-12
    • 2012-05-30
    相关资源
    最近更新 更多