首 页 | 精品电影 | 音乐天堂 | 在线游戏 | Flash MTV | 三湘书屋 | 幽默笑话 | 三湘图库 | 美女写真 | IT知识库 | QQ贴图 | 加入书签

网页制作网络编程图形图象操作系统冲浪宝典软件教学网络安全认证考试通信技术电子商务业内动态书籍教程原码

最近更新 文章分类 多媒体类 精品软件

本站搜索:
您的位置:三湘时空 -> IT知识库 -> 文章分类 -> Javascript教程 -> JavaScript极速狂飙:大容量字符型数组的快速检索
JavaScript极速狂飙:大容量字符型数组的快速检索


文章类别:Javascript教程 来源: 作者: 发表日期:2006-1-6 字体:[ ]

小游戏 | 在线影院 | 幽默笑话 | 源码下载 | Flash MTV | 音乐试听 | 书屋 | 美女写真

    JavaScript 在大容量数组的循环方面效率不尽人意,我曾经做过一个比对,与VBS的数组相比较,VBS的数组循环速度大致比JS要快一个数量级(http://community.csdn.net/Expert/TopicView.asp?id=4313487)。JS数组在一般的编程当中我们也不会太去注意它的效率问题:才几十个元素的数组效率即使差点你也看不出来,但节点量一大,比如几千、比如上万个节点量的数组循环,那效率问题就成了首要考虑解决的问题了。大容量数组的检索大致有以下几个应用:select做combo box时的快速匹配、树的查询、表格table排序或者检索等。

    下面我来做一个测试,首先我先创建一个大容量的数组:

    <SCRIPT LANGUAGE="JavaScript">
    var n = 100000; //数组的最大容量
    var a = new Array();
    for(var i=0; i<n; i++)
    {
      a[i] = Math.random() +"";
    }
    </SCRIPT>

    这样我就创建了一个长度为 100000 的字符型数组,然后我再检索字符串以 0.9999 开始的字符串,并存入另一个数组中。

    <SCRIPT LANGUAGE="JavaScript">
    var n = 100000; //数组的最大容量
    var a = new Array();
    for(var i=0; i<n; i++)
    {
      a[i] = Math.random() +"";
    }

    var begin = new Date().getTime();
    var b = new Array();
    for(var i=0; i<n; i++)
    {
      if(a[i].indexOf("0.9999")==0)
      {
        b[b.length] = a[i];
      }
    }
    document.write("数组长度:"+ n);
    document.write("<br>传统循环法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索的结果:<strong title='"+ b.join("&#13;")
    +"'>检索到 "+ b.length +" 个记录!</strong>");
    </SCRIPT>

    这步操作我这里耗时都在2800毫秒左右,说明一下,这里的循环非常简单,只有一个 if 判断和一个赋值操作,非常简单,若这里的判断稍微复杂一些那它的耗时将是数量级的增大。那么对于这种问题有什么好的优化方案吗?答案当然是有的,否则我开这个贴子说的全是费话了。但是对于这个问题不能再使用我们的传统思维来优化,因为在传统的思维里已经找不出再好的写法了。

    解决的方案就是:先把数组join()成一个大字符串,然后用正则表达式对这个大字符串进行匹配检索。这个方法算是我的个人独创吧,在我写树的过程中想出的歪招,不过效率真的不赖。关于join()的效率我已经开贴讨论过了(http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx  JavaScript极速狂飙:组合拼接字符串的效率)。这个优化方案需要有一定的正则表达式功底。

<input id="count" value="50000" size="7" maxlength="6">
<input type="button" value="数组初始华" onclick="txt.innerHTML = array_init()"><br>
<input type="button" value="传统循环" onclick="txt.innerHTML += method_for()">
<input type="button" value="正则匹配" onclick="txt.innerHTML += method_regexp()">
<div id="txt"></div>

<SCRIPT LANGUAGE="JavaScript">
var txt = document.getElementById("txt");
var a = new Array();

function array_init()
{
    var n = parseInt(document.getElementById("count").value);
    a.length = 0;
    for(var i=0; i<n; i++)
    {
      a[i] = Math.random() +"";
    }
    return "数组长度:"+ n;
}

function method_for()
{
    var n = a.length;
    var begin = new Date().getTime();
    var b = new Array();
    for(var i=0; i<n; i++)
    {
      if(a[i].indexOf("0.9999")==0)
      {
        b[b.length] = a[i];
      }
    }
    return ("<br>传统循环法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索的结果:<strong title='"+ b.join("&#13;")
    +"'>检索到 "+ b.length +" 个记录!</strong>");
}

function method_regexp()
{
    var begin = new Date().getTime();
    var b = new Array();
    var s = a.join("\x0f");
    var r = new RegExp().compile("0\\.9999\\d+", "g");
    b = s.match(r);   s = "";
    return ("<br>正则匹配法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索的结果:<strong title='"+ b.join("&#13;")
    +"'>检索到 "+ b.length +" 个记录!</strong>");
}
</SCRIPT>

    大家可以测试一下,上面两种方法之间的效率到底相差多少!代码是死的,人是活的,换一种思维换一种模式,效率将大相径庭。

    这一招我是花了好多脑筋才想出来的招,真有点舍不得放出来,现在就拿它恭贺大家2006新的一年的开始吧。

上一篇:图片自动缩小的js代码,用以防止图片撑破页面 下一篇:实例简析XPath串函数和XSLT
本栏目热门文章
·javascript+xml实现二级下拉菜单,不会被任何标签或元素遮 2005-10-4
·JavaScript Web页面内容导出到Word、Excel 2005-11-7
·用javascript连接access数据库的方法 2005-10-4
·JAVASCRIPT加密解密终级指南 2005-10-4
·TreeView节点互斥,autopostback=false的方法 2005-10-4
·网页对联广告代码效果大全 2005-11-7
·网页javascript精华代码集 2006-1-6
·Javascript的IE和Firefox兼容性汇编 2005-10-4
·利用JS获取IE客户端IP及MAC的实现 2006-1-10
·javascript应用:实现复选框全选/全不选切换 2006-1-6
新近更新文章
·网页特效:图片随机显示技巧 2006-6-15
·一个非常漂亮的脚本日历 2006-6-15
·用javascript实现(页面正在加载的效果) 2006-6-15
·调试javascript的好方法 2006-6-9
·js代码小记(判断textbox的长度,并且固定最多收入字符) 2006-6-9
·更正用AJAX实现IE TREE无刷新取值的方法 2006-6-4
·修改后的prototype.js,增加进度条和验证输入框 2006-5-28
·用js写的一个跑马灯 2006-5-28
·JS代码的格式化和压缩 2006-5-28
·突破IE屏蔽限制,自己的网站使劲弹新IE窗口 2006-5-22
首 页 | 软件发布 | 广告联系 | 下载帮助 | 意见反馈 | 网站地图
  CopyRight? 2002-2004 WWW.SXSKY.NET? All Rights Reserved
三湘时空 站长QQ:82675303 Email: