首页 > 开发 > AJAX > 正文

探讨一种AJAX性能的改进方法

2024-07-21 02:28:49
字体:
来源:转载
供稿:网友

  一、 引言

  在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
<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函数三次。

  对于上面的测试用例,我得到如下的日志输出数据:

//请注意,为了解释之目的,我在其中手工加入了一些日志行
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()的次数。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表