Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497817
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:33:44

下载本文示例代码
  一、 引言  在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.vbPublic 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 PropertyEnd Class'WebForm1.aspx.vbPublic Class WebForm1Public Student As New StudentSub 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 FunctionEnd Class'WebForm2.aspx.vbPublic Class WebForm2Public Student As New StudentSub 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 FunctionEnd 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.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()-------First Call For GetData()--------5/9/2006 10:37:29 AM>>From Student.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()-------Second Call For GetData()--------5/9/2006 10:37:29 AM>>From Student.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()-------Third Call For GetData()--------5/9/2006 10:37:30 AM>>From Student.Constructor5/9/2006 10:37:30 AM>>From WebForm1.Constructor5/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.Constructor5/9/2006 10:37:09 AM>>From WebForm2.Constructor5/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()的次数。   一、 引言  在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.vbPublic 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 PropertyEnd Class'WebForm1.aspx.vbPublic Class WebForm1Public Student As New StudentSub 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 FunctionEnd Class'WebForm2.aspx.vbPublic Class WebForm2Public Student As New StudentSub 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 FunctionEnd 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.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()-------First Call For GetData()--------5/9/2006 10:37:29 AM>>From Student.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()-------Second Call For GetData()--------5/9/2006 10:37:29 AM>>From Student.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Constructor5/9/2006 10:37:29 AM>>From WebForm1.Ajax.getData()-------Third Call For GetData()--------5/9/2006 10:37:30 AM>>From Student.Constructor5/9/2006 10:37:30 AM>>From WebForm1.Constructor5/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.Constructor5/9/2006 10:37:09 AM>>From WebForm2.Constructor5/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()的次数。 下载本文示例代码


探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法探讨一种AJAX性能的改进方法
阅读(122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~