<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Architecting Life &#187; Performance</title>
	<atom:link href="http://xujiwei.com/blog/tags/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://xujiwei.com/blog</link>
	<description>Just do it</description>
	<lastBuildDate>Wed, 28 Dec 2011 02:06:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>ASP中使用FileSystemObject时提高性能的一个小技巧</title>
		<link>http://xujiwei.com/blog/enhance-performance-of-fso-in-asp/</link>
		<comments>http://xujiwei.com/blog/enhance-performance-of-fso-in-asp/#comments</comments>
		<pubDate>Fri, 16 May 2008 14:45:30 +0000</pubDate>
		<dc:creator>Xu Jiwei</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[FileSystemObject]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://tmp.xujiwei.com/blog/?p=57</guid>
		<description><![CDATA[<a href="http://xujiwei.com/blog/enhance-performance-of-fso-in-asp/" title="ASP中使用FileSystemObject时提高性能的一个小技巧"></a>在封装自己的FileSystemObject库的时候，测试的时候发现在文件夹或文件很多的时候，效率很低，显示一个文件夹需要2秒甚至更多，这让我很是奇怪，因为显示文件夹及文件信息的时候直接都是使用Folder及File对象的属性，这应该不会引起性能上的问题，但是事实却说明我的想法过于简单了。 按个测试了一下可能会是哪些属性引起的性能问题，在去掉Type也就是类型属性显示的时候，性能有了很大提高，之后的测试也证明了是Type属性的使用导致了性能问题。 仔细想了一下，Type引起性能低的原因应该是，引用Type属性所得到的是文件的具体类型信息，也就是我们在资源浏览器里看到的那样，比如TXT文件的类型就是显示为“文本文档”，但是这个类型信息却是存储在系统中，通过文件扩展名进行关联的。在FSO中使用Type属性的时候，对于每个File对象，FSO都需要根据扩展名去系统中检索这个扩展名对应的类型名称，这样，就极大的降低了性能。 因此，在使用FileSystemObject时，如果可以不使用File或者Folder对象的Type属性，就尽量不使用。 希望此文对你有所帮助。 by Xu Jiwei]]></description>
			<content:encoded><![CDATA[<a href="http://xujiwei.com/blog/enhance-performance-of-fso-in-asp/" title="ASP中使用FileSystemObject时提高性能的一个小技巧"></a><p>在封装自己的FileSystemObject库的时候，测试的时候发现在文件夹或文件很多的时候，效率很低，显示一个文件夹需要2秒甚至更多，这让我很是奇怪，因为显示文件夹及文件信息的时候直接都是使用Folder及File对象的属性，这应该不会引起性能上的问题，但是事实却说明我的想法过于简单了。</p>

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

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

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

<p>希望此文对你有所帮助。</p>

<p>by Xu Jiwei</p>
]]></content:encoded>
			<wfw:commentRss>http://xujiwei.com/blog/enhance-performance-of-fso-in-asp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ASP] 在JScript中使用RecordSet对象的GetRows方法</title>
		<link>http://xujiwei.com/blog/use-getrows-of-recordset-in-jscript/</link>
		<comments>http://xujiwei.com/blog/use-getrows-of-recordset-in-jscript/#comments</comments>
		<pubDate>Sun, 11 Mar 2007 09:34:02 +0000</pubDate>
		<dc:creator>Xu Jiwei</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[JScript]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.xujiwei.com/blog/?p=208</guid>
		<description><![CDATA[<a href="http://xujiwei.com/blog/use-getrows-of-recordset-in-jscript/" title="[ASP] 在JScript中使用RecordSet对象的GetRows方法"></a>写ASP程序时，一般情况总是使用的VBScript，不过也不只是这一种选择，也可以用JScript。但在用JScript作为ASP的语言时，比用VBScript有一些小小的不方便，比如RecordSet的GetRows方法。 在ASP中操作数据库，一般都要用到RecordSet对象，如果注重程序效率的话，可能就会用到RecordSet对象的GetRows方法，把记录集对象转换成数组，而操作数组在速度上将比用RecordSet对象的MoveNext方法快很多，而且可以在取出数组后尽早释放RecordSet对象，从而减少资源的占用，这也是优化ASP性能的一个方法。 在VBScript里，用RecordSet.GetRows方法取到的是一个二维数组，里面的数据可以通过遍历数组的方式来取得。 假设现在有一个数据库，其中有一个表名为mytable，有3个字段，名称分别为id,first,second。 程序代码：[ 复制代码到剪贴板 ] &#8216; code by xujiwei &#8216; http://www.xujiwei.cn/ &#8216; 定义变量 Dim conn,rs,data,recN,i &#8216; 连接数据库 Set conn=Server.CreateObject(&#8220;ADODB.Connection&#8221;) conn.Open &#8221;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&#8221; &#38;_ Server.MapPath(&#8220;data.mdb&#8221;) &#8216; 获取记录集 Set rs=conn.Execute(&#8220;SELECT id,first,second FROM mytable&#8221;) &#8216; 获取数据数组 data=rs.GetRows() &#8216; 关闭记录集，释放对象 rs.Close() Set rs=Nothing &#8216; 获取记录数 recN=UBound(data,2) &#8216; 循环输出数据 For i=0 To recN &#8216; 注意，数组下标从0开始 &#8216; 显示数据库中数据 Response.Write(&#8220;ID: &#8221;&#38;data(0,i)&#38;&#8221;, First: &#8221;&#38;data(1,i)&#38;_ &#8220;, Second: &#8221;&#38;data(2,i)&#38;&#8221;&#60;br /&#62;&#8221;) Next &#8216; 关闭数据库连接，释放对象 conn.Close() Set conn=Nothing %&#62; 但是在JScript使用时，就会有一个问题，那就是JScript并没有二维数组，如果要用GetRows所获取的数据，必要将这个VBScript中的二维数组转换成JScript能识别的数组，即元素为数组的一个一维数组。 在JScript里，用GetRows方法获取的数组有一个toArray方法，可以转换成JScript中能用的数组，但是这个数组是一维的，也就是说，如果要像在VBScript一样使用的话，还需要我们自己来做转换。 查阅了MSDN及在网上搜索了相关的文章之后，我写了一个数组转换的函数用于在JScript中使用GetRows方法。 程序代码：[ 复制代码到剪贴板 &#8230;<p class="read-more"><a href="http://xujiwei.com/blog/use-getrows-of-recordset-in-jscript/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://xujiwei.com/blog/use-getrows-of-recordset-in-jscript/" title="[ASP] 在JScript中使用RecordSet对象的GetRows方法"></a><p>写ASP程序时，一般情况总是使用的VBScript，不过也不只是这一种选择，也可以用JScript。但在用JScript作为ASP的语言时，比用VBScript有一些小小的不方便，比如RecordSet的GetRows方法。</p>

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

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

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

<div class="codeHead">程序代码：<a href="javascript:CopyText($('CODE_5441'));">[ 复制代码到剪贴板 ]</a></div>

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

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

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

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

<div class="codeHead">程序代码：<a href="javascript:CopyText($('CODE_7422'));">[ 复制代码到剪贴板 ]</a></div>

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

<p>对于一些更新频率不高，而使用次数比较多的数据，可以在成功获取数据数组之后，用Application对象来缓存起来，从而减少对数据库的查询次数，一定程序程度上优化ASP的性能。</p>
]]></content:encoded>
			<wfw:commentRss>http://xujiwei.com/blog/use-getrows-of-recordset-in-jscript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

