65.9K
CodeProject 正在变化。 阅读更多。
Home

提高 AJAX 的性能

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (8投票s)

2006年5月10日

2分钟阅读

viewsIcon

36989

在 WebForms 中使用 AJAX 时,提升性能的一个简单技巧。

引言

在 Web Forms 中,我们使用 AJAX 从客户端(从 JavaScript)调用服务器端方法。AJAX 内部使用 XMLHttpRequest。我测试了以不同方式实现的许多 AJAX 函数。我还监控了 AJAX 调用的性能和生命周期。我发现在使用 AJAX 在 Web Forms 中存在一些严重问题。并且,我找到了解决该问题的方法。在本文中,我将分享问题和解决方案

使用 AJAX 时的性能问题

对于每个 AJAX 调用,我们都会创建一个包含 AJAX 方法的类的实例。如果我们在类级别使用 new 关键字,它还会为字段、属性和其他类级别变量创建实例。

概念验证

我创建了一个包含两个 Web Forms,WebForm1.aspxWebForm2.aspx,和一个类,Student.vb 的项目。两个代码隐藏页面都有一个 getData() AJAX 函数和一个类型为 Student 的公共变量。使用 MXLogger 类,我记录了执行流程的每个阶段。

注意:Webform2.aspxGetData() AJAX 函数是 Shared。在 WebForm1 中,它不是 Shared

'Student.vb

Public Class Student
    
    Sub New()
        MXLogger.AddLog("From Student.Constructor")
    End Sub
    
    Dim _Name As String
   
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal Value As String)
            _Name = Value
        End Set
    End Property

End Class


'WebForm1.aspx.vb

Public Class WebForm1
    
    Public Student As New Student

    Sub New()
        MXLogger.AddLog("From WebForm1.Constructor")
    End Sub

    <Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.Read)> _
    Public Function getData() As String
        MXLogger.AddLog("From WebForm1.Ajax.getData()")
        Return "I m a Non Shared Function"
    End Function
End Class


'WebForm2.aspx.vb

Public Class WebForm2
   
    Public Student As New Student

    Sub New()
        MXLogger.AddLog("From WebForm2.Constructor")
    End Sub

    <Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.Read)> _
    Public Shared Function getData() As String
        MXLogger.AddLog("From WebForm2.Ajax.getData()")
        Return "I m a Shared Function"
    End Function
End Class

测试应用程序

  • 测试用例 1

    运行 webform1.aspx 并从 JavaScript 调用 getData() AJAX 函数三次。

  • 测试用例 2

    运行 webform2.aspx 并从 JavaScript 调用 getData() AJAX 函数三次。

对于上述测试用例,我获得了如下日志

//Please Note: Some of these log lines
// I have added Manually for explanation purpose.
 
LOG for the Test Case 1:  ( Non Ajax Shared Function )

-------While Loading The Page--------
5/9/2006 10:37:29 AM>>From Student.Constructor
5/9/2006 10:37:29 AM>>From WebForm1.Constructor
5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()
-------First Call For GetData()--------
5/9/2006 10:37:29 AM>>From Student.Constructor
5/9/2006 10:37:29 AM>>From WebForm1.Constructor
5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()
-------Second Call For GetData()--------
5/9/2006 10:37:29 AM>>From Student.Constructor
5/9/2006 10:37:29 AM>>From WebForm1.Constructor
5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()
-------Third Call For GetData()--------
5/9/2006 10:37:30 AM>>From Student.Constructor
5/9/2006 10:37:30 AM>>From WebForm1.Constructor
5/9/2006 10:37:30 AM>>From WebForm1.Ajax.getData()

LOG for the Test Case 2:  ( Shared Ajax Function )

-------While Loading The Page--------
5/9/2006 10:37:09 AM>>From Student.Constructor
5/9/2006 10:37:09 AM>>From WebForm2.Constructor
5/9/2006 10:37:09 AM>>From WebForm2.Ajax.getData()
-------First Call For GetData()--------
5/9/2006 10:38:11 AM>>From WebForm2.Ajax.getData()
-------Second Call For GetData()--------
5/9/2006 10:38:11 AM>>From WebForm2.Ajax.getData()
-------Third Call For GetData()--------
5/9/2006 10:38:11 AM>>From WebForm2.Ajax.getData()

在上述日志中,我们可以看到对于测试用例 1,我们可以看到更多来自 Webform1Student 构造函数的日志。

结论

我的建议是,在所有可能的地方,我们都应该使用 Shared 方法进行 AJAX 调用,这样它就不会创建更多的 Web Form 实例以及类级别字段。因此,我们可以减少 GC 的 Finalize() 调用次数。

© . All rights reserved.