分享
 
 
 

&#106avascript极速狂飙:大容量字符型数组的快速检索

王朝html/css/js·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

JavaScript 在大容量数组的循环方面效率不尽人意,我曾经做过一个比对,与VBS的数组相比较,VBS的数组循环速度大致比JS要快一个数量级。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()成一个大字符串,然后用正则表达式对这个大字符串进行匹配检索。这个方法算是我的个人独创吧,在我写树的过程中想出的歪招,不过效率真的不赖。这个优化方案需要有一定的正则表达式功底。

<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新的一年的开始吧。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有