【问题标题】:Performance-impact of empty Page_Load() methods空 Page_Load() 方法的性能影响
【发布时间】:2011-03-23 16:26:26
【问题描述】:

向 ASP.NET Webforms 应用程序添加新页面或用户控件时,代码隐藏类包含一个空的 Page_Load() 事件处理程序:

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

我有一个现有的网络应用程序,其中许多页面和控件仍然包含这些空事件处理程序(它们未使用)。

问题:这些空事件处理程序是否会对性能产生影响,因此是否应该从所有页面和控件中删除它们?

请注意:由于调用了空事件处理程序,我主要(或不仅)关心任何运行时开销。我还想知道页面(标记)是 JIT 编译时的任何开销(因为事件处理程序必须连接到事件 - 可能使用一些反射代码)。

更新:到目前为止还没有真正的答案,所以我不能接受任何一个。

【问题讨论】:

标签: asp.net performance webforms


【解决方案1】:

AutoEventWireup 不会在编译时完成。当它设置为true 时,运行时必须为此使用Delegate.CreateDelegate 方法查找每个页面事件处理程序。这是一篇描述这种行为的精彩文章:Inside AutoEventWireup

这里有一个类似的问题:What is the performance cost of autoeventwireup?

【讨论】:

    【解决方案2】:

    虽然必须调整堆栈帧以进入和离开您的方法(并且什么都不做),而不是简单地调用基本实现(在本例中为 System.Web.UI.Page ),但性能影响非常小并且很可能无法测量,因此您应该没问题。

    【讨论】:

    • 没有基本实现,因为 Page_Load 是一个事件处理程序,而不是虚拟方法的覆盖!事件处理程序必须在运行时连接到 Load-event。
    • 通过基本实现,我指的是触发委托的内部 Page 方法,如果它具有误导性或暗示对某些人的继承,我深表歉意。然而,这个概念是相同的,因为堆栈帧将被调整。此外,许多 .NET 商店中的一种常见方法是创建一个继承自 Page 的类,该类充当应用程序页面继承自的基本实现。
    【解决方案3】:

    我相当肯定 Page_Load 无论是否存在都会发生。很像 PreRender 发生,或 Page_Init。

    删除它不会对性能产生任何影响。

    【讨论】:

    • “Page_Load 发生”是什么意思?你能详细说明吗? PreRender 或 OnLoad 是被覆盖的虚拟方法,而 Page_Load 和 Page_Init 是事件处理程序。我不认为他们可以比较。
    • 好吧,我的意思是,Page_Load 是否会被调用,无论您是否实际定义了该方法?即使您没有定义方法,也会发生 PreRender。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多