○一、引言 在Web表单中,我们使用AJA...... 一、 引言 在Web表单中,我们使用AJAX来从客户端(通过JavaScript)调用服务端方法,而在AJAX内部则进行XMLHttpRequest调用。我测试了一些以不同方式实现的AJAX函数。另外,我还监控分析了进行AJAX调用的性能和生命周期。结果,我发现在Web表单中使用AJAX时存在一些严重的问题。不过,我也找到了这些问题的一种解决方法。在本文中,我正是想与各位分析这一问题及其相应的解决方案。 二、 在使用AJAX时所遇到的性能问题 对于每一个AJAX调用来说,我们都要创建包含AJAX方法的类的一个实例。另外,如果我们在类级上使用new关键字的话,我们还要为字段、属性及其它类级的变量创建实例。 三、 实现方案 我创建了一个工程,它包含两个Web表单:WebForm1.aspx和WebForm2.aspx,还有一个类Student.vb。这两部分code-behind页面都使用了一个AJAX函数getData()和一个Student类型的公共变量。借助于MXLogger类,我记录下每一个阶段的执行流程。 注意:Webform2.aspx的AJAX函数GetData()是共享的,而在WebForm1中,它不是共享的。 '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 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 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函数三次。 对于上面的测试用例,我得到如下的日志输出数据: //请注意,为了解释之目的,我在其中手工加入了一些日志行 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的构造器的日志数据。 五、 结论 我的建议是,在所有可能的地方,我们应该使用针对于AJAX的共享方法,以便它不会创建更多的Web表单实例和类级的字段。这样以来,我们就可以减少从GC中调用Finalize()的次数。 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-30 05:28 , Processed in 0.168071 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.