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

2016-02-19 15:18 0 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐JavaScript极速狂飙:大容量字符型数组的快速检索,赶紧看过来吧!

【 tulaoshi.com - Web开发 】

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

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

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

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

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

    var begin = new Date().getTime();
    var b = new Array();
    for(var i=0; in; 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("
")
    +"''检索到 "+ b.length +" 个记录!/strong");
    /SCRIPT

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

    这步操作我这里耗时都在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; in; 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; in; i++)
    {
      if(a[i].indexOf("0.9999")==0)
      {
        b[b.length] = a[i];
      }
    }
    return ("br传统循环法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索的结果:strong title=''"+ b.join("
")
    +"''检索到 "+ b.length +" 个记录!/strong");
}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

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

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

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

来源:https://www.tulaoshi.com/n/20160219/1609368.html

延伸阅读
标签: Web开发
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" HTML  HEAD   TITLE New Document /TITLE   META NAME="Generator" CONTENT="EditPlus"   META NAME="Author" CONTENT=""   META NAME="Keywords" CONTENT=""   META NAME="Description" CONTENT=""   script type="text/javascript"  v...
标签: Web开发
shift :删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5]  b:1 unshift :将参数添加到原数组开头,并返回数组的长度 var a = [1,2,3,4,5]; var b = a.unshift(-2,-1); //a:[-2,-1,1,2,3,4,5]  b:7 注:在IE6.0下测试返回值总为undef...
标签: 天天飞车
《天天飞车》极速狂飙模式怎么开启 《天天飞车》狂飙模式: 在游戏中,会出现一些的随机英文单词,玩家只要收集到这个单词的每个字母即可进入极速狂飙模式。 天天飞车狂飙模式好处: 在极速狂飙模式下,玩家可以尽情的收集金币和进行刷分,在这个模式下,玩家不会遇见任何的障碍,而且在这模式时间到了之后还会进入超级喷射状态,...
标签: Web开发
javascript 中 Array.sort()方法是用来对数组项进行排序的 ,默认情况下是进行升序排列,实例代码如下: var arrA = [6,2,4,3,5,1];arrA.sort();document.writeln(arrA); //结果是:1,2,3,4,5,6 sort() 方法可以接受一个 方法为参数 ,这个方法有两个参数。分别代表每次排序比较时的两个数组项。sort()排序时每次比较两个...
标签: Web开发
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符转义,即,将反斜杠字符 (\) 放在它们前面。下表列出了特殊字符以及它们的含义: 特殊字符表 特殊字符 注释 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,那么 $ 还匹配 \n 或 \r 前面的位置。若要匹...

经验教程

318

收藏

63
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部