标签存档: Performance

ASP中使用FileSystemObject时提高性能的一个小技巧

在封装自己的FileSystemObject库的时候,测试的时候发现在文件夹或文件很多的时候,效率很低,显示一个文件夹需要2秒甚至更多,这让我很是奇怪,因为显示文件夹及文件信息的时候直接都是使用Folder及File对象的属性,这应该不会引起性能上的问题,但是事实却说明我的想法过于简单了。

按个测试了一下可能会是哪些属性引起的性能问题,在去掉Type也就是类型属性显示的时候,性能有了很大提高,之后的测试也证明了是Type属性的使用导致了性能问题。

仔细想了一下,Type引起性能低的原因应该是,引用Type属性所得到的是文件的具体类型信息,也就是我们在资源浏览器里看到的那样,比如TXT文件的类型就是显示为“文本文档”,但是这个类型信息却是存储在系统中,通过文件扩展名进行关联的。在FSO中使用Type属性的时候,对于每个File对象,FSO都需要根据扩展名去系统中检索这个扩展名对应的类型名称,这样,就极大的降低了性能。

因此,在使用FileSystemObject时,如果可以不使用File或者Folder对象的Type属性,就尽量不使用。

希望此文对你有所帮助。

by Xu Jiwei

[ASP] 在JScript中使用RecordSet对象的GetRows方法

写ASP程序时,一般情况总是使用的VBScript,不过也不只是这一种选择,也可以用JScript。但在用JScript作为ASP的语言时,比用VBScript有一些小小的不方便,比如RecordSet的GetRows方法。

在ASP中操作数据库,一般都要用到RecordSet对象,如果注重程序效率的话,可能就会用到RecordSet对象的GetRows方法,把记录集对象转换成数组,而操作数组在速度上将比用RecordSet对象的MoveNext方法快很多,而且可以在取出数组后尽早释放RecordSet对象,从而减少资源的占用,这也是优化ASP性能的一个方法。

在VBScript里,用RecordSet.GetRows方法取到的是一个二维数组,里面的数据可以通过遍历数组的方式来取得。

假设现在有一个数据库,其中有一个表名为mytable,有3个字段,名称分别为id,first,second。

  • ‘ code by xujiwei
  • ‘ http://www.xujiwei.cn/
  • ‘ 定义变量
  • Dim conn,rs,data,recN,i
  • ‘ 连接数据库
  • Set conn=Server.CreateObject(“ADODB.Connection”)
  • conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” &_
  • Server.MapPath(“data.mdb”)
  • ‘ 获取记录集
  • Set rs=conn.Execute(“SELECT id,first,second FROM mytable”)
  • ‘ 获取数据数组
  • data=rs.GetRows()
  • ‘ 关闭记录集,释放对象
  • rs.Close()
  • Set rs=Nothing
  • ‘ 获取记录数
  • recN=UBound(data,2)
  • ‘ 循环输出数据
  • For i=0 To recN
  • ‘ 注意,数组下标从0开始
  • ‘ 显示数据库中数据
  • Response.Write(“ID: “&data(0,i)&”, First: “&data(1,i)&_
  • “, Second: “&data(2,i)&”<br />”)
  • Next
  • ‘ 关闭数据库连接,释放对象
  • conn.Close()
  • Set conn=Nothing
  • %>

但是在JScript使用时,就会有一个问题,那就是JScript并没有二维数组,如果要用GetRows所获取的数据,必要将这个VBScript中的二维数组转换成JScript能识别的数组,即元素为数组的一个一维数组。

在JScript里,用GetRows方法获取的数组有一个toArray方法,可以转换成JScript中能用的数组,但是这个数组是一维的,也就是说,如果要像在VBScript一样使用的话,还需要我们自己来做转换。

查阅了MSDN及在网上搜索了相关的文章之后,我写了一个数组转换的函数用于在JScript中使用GetRows方法。

  • <script language=”JScript” runat=”server”>
  • // code by xujiwei
  • // http://www.xujiwei.cn/
  • // 定义变量
  • var conn,rs,vdata,data,recN,i;
  • // 连接数据库
  • conn=Server.CreateObject(“ADODB.Connection”);
  • conn.Open(“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”+
  • Server.MapPath(“data.mdb”));
  • // 获取记录集
  • rs=conn.Execute(“SELECT id,first,second FROM test”);
  • // 获取数据数组,并转换成为JScript中可用的数组类型
  • vdata=rs.GetRows().toArray();
  • // 获取数据表的字段数
  • i=rs.Fields.Count;
  • // 关闭记录集,释放对象
  • rs.Close();
  • rs=null;
  • // 转换数组
  • data=transArray(vdata,i);
  • // 获取记录数
  • recN=data.length;
  • // 循环输出数据
  • for(i=0;i<recN;i++) {
  • // 注意,数组下标从0开始
  • // 显示数据库中数据
  • Response.Write(“ID: “+data[i][0]+”, First: “+data[i][1]+
  • “, Second: “+data[i][2]+”<br />”);
  • }
  • // 关闭数据库连接,释放对象
  • conn.Close();
  • conn=null;
  • // 数组转换函数
  • // by xujiwei
  • // 参数:arr – GetRows方法得到的对象用toArray方法得到的数组
  • //       fieldslen – 数据表字段数
  • function transArray(arr,fieldslen) {
  • var len=arr.length/fieldslen,data=[],sp;
  • for(var i=0;i<len;i++) {
  • data[i]=new Array();
  • sp=i*fieldslen;
  • for(var j=0;j<fieldslen;j++)
  • data[i][j]=arr[sp+j];
  • }
  • return data;
  • }
  • </script>

对于一些更新频率不高,而使用次数比较多的数据,可以在成功获取数据数组之后,用Application对象来缓存起来,从而减少对数据库的查询次数,一定程序程度上优化ASP的性能。