所有  育婴常识  文学故事  建站教程  幽默笑话  菜谱 
这篇不太合适?↑↑重新搜索一下看看。↑↑
[Javascript]javascript极速狂飙:大容量字符型数组的快速检索

Root In:http://www.knowsk...com/303249.html    Add Time:2006-2-19 11:57:01    Click Count:3221


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


上一篇:[Javascript]javascript极速狂飙:组合拼接字符串的效率   下一篇:[Javascript]图片自动缩小的js代码,用以防止图片撑破页面

本站所有文章均为系统从互联网自动获取、分析后入库,文章内容不代表本站立场;

本程序及文章内容仅供学习之用,所有的资料和图象均以获得信息为目的;所有的资料和图象均不得用于商业目的;

本网站(PYZY.net)所有的内容中若涉及您的权益请及时与俺联系QQ:33918148。