提高 AJAX 的性能





2.00/5 (8投票s)
2006年5月10日
2分钟阅读

36989
在 WebForms 中使用 AJAX 时,提升性能的一个简单技巧。
引言
在 Web Forms 中,我们使用 AJAX 从客户端(从 JavaScript)调用服务器端方法。AJAX 内部使用 XMLHttpRequest
。我测试了以不同方式实现的许多 AJAX 函数。我还监控了 AJAX 调用的性能和生命周期。我发现在使用 AJAX 在 Web Forms 中存在一些严重问题。并且,我找到了解决该问题的方法。在本文中,我将分享问题和解决方案。
使用 AJAX 时的性能问题
对于每个 AJAX 调用,我们都会创建一个包含 AJAX 方法的类的实例。如果我们在类级别使用 new
关键字,它还会为字段、属性和其他类级别变量创建实例。
概念验证
我创建了一个包含两个 Web Forms,WebForm1.aspx、WebForm2.aspx,和一个类,Student.vb 的项目。两个代码隐藏页面都有一个 getData()
AJAX 函数和一个类型为 Student
的公共变量。使用 MXLogger
类,我记录了执行流程的每个阶段。
注意:Webform2.aspx 的 GetData()
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,我们可以看到更多来自 Webform1
和 Student
构造函数的日志。
结论
我的建议是,在所有可能的地方,我们都应该使用 Shared
方法进行 AJAX 调用,这样它就不会创建更多的 Web Form 实例以及类级别字段。因此,我们可以减少 GC 的 Finalize()
调用次数。