发现一个很奇怪的结果:
------------------------------------------
IE6.0下测试:
----------------------------------------------
数组长度:100000
传统循环法耗时 4172 毫秒!检索的结果:检索到 15 个记录!
正则匹配法耗时 141 毫秒!检索的结果:检索到 15 个记录!
---------------------------------------------------------
Firefox1.5下测试:
--------------------------------------------------
数组长度:100000
传统循环法耗时 687 毫秒!检索的结果:检索到 11 个记录!
正则匹配法耗时 6063 毫秒!检索的结果:检索到 11 个记录!

解决方案 »

  1.   

    cvpc(一回) 强!楼主其实只证明了“JavaScript 在大容量字符数组的循环方面效率不尽人意”而没有证明“JavaScript 在大容量数组的循环方面效率不尽人意”。
    要真正看“数组”而不是“字符数组”的效率,是不可以这样测试的。试试:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> emu's test </TITLE>
    <META NAME="Author" CONTENT="emu">
    </HEAD><BODY>
    <SCRIPT LANGUAGE="JavaScript">
    var n = 100000; //数组的最大容量
    var a = new Array(n);
    for(var i=0; i<n; i++)
    a[i] = Math.random() ;function traditional(){
    var b = new Array();
    var begin = new Date().getTime();
    for(var i=0; i<n; i++)
    if(a[i]>=0.999)
    b[b.length] = a[i];
    return "传统循环法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
    }
    function meizz(){
    var begin = new Date().getTime();
    var ch = "\x0f"
    var s = a.join(ch);
    var r = new RegExp("0\\.999[^\\"+ch+"]+", "g");
    var b = s.match(r);   s = "";
    return "正则匹配法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
    }</SCRIPT>
    <button onclick="output.innerHTML+=traditional();">test traditional</button>
    <button onclick="output.innerHTML+=meizz();">test meizz</button>
    <div id=output style="width:600;height:400;border:1 solid gray;overflow:scroll"></div>
    </BODY>
    </HTML>
      

  2.   

    不愧为Javascript版版主!Javascipt代码,用量少,还实惠,一直用它!
      

  3.   

    对不起,上面的测试不能在firefox里面运行。更正一下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> emu's test </TITLE>
    <META NAME="Author" CONTENT="emu">
    </HEAD><BODY>
    <SCRIPT LANGUAGE="JavaScript">
    var n = 100000; //数组的最大容量
    var a = new Array(n);
    for(var i=0; i<n; i++)
    a[i] = Math.random() ;function traditional(){
    var b = new Array();
    var begin = new Date().getTime();
    for(var i=0; i<n; i++)
    if(a[i]>=0.999)
    b[b.length] = a[i];
    return "传统循环法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
    }
    function meizz(){
    var begin = new Date().getTime();
    var ch = "\x0f"
    var s = a.join(ch);
    var r = new RegExp("0\\.999[^\\"+ch+"]+", "g");
    var b = s.match(r);   s = "";
    return "正则匹配法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
    }</SCRIPT>
    <button onclick="document.getElementById('output').innerHTML+=traditional();">test traditional</button>&nbsp;
    <button onclick="document.getElementById('output').innerHTML+=meizz();">test meizz</button><BR><BR>
    <div id=output style="width:600;height:400;border:1px solid gray;overflow:scroll"></div>
    </BODY>
    </HTML>其实js的数组处理还是很快的,不能把字符串处理(indexOf)的帐算到array头上来。
      

  4.   

    嗯,我在贴子标题上就说明了是针对字符型数组,而不是数字型的,因为在 for 循环里还有大量其它的判断语句,所以会影响效率,可能是我举的例子不够贴切吧,我也没辄呀,要创建这么大容量的数组也不容易呀。
      

  5.   

    针对EMU所说的 document.write() 会影响时间的统计,我改了一下例子代码。<input id="count" value="20000" size="7" maxlength="6">
    <input type="button" value="数组初始华" onclick="txt.innerHTML = array_init()"><br>
    <input type="button" value="传统循环" onclick="txt.innerHTML += method_old()">
    <input type="button" value="正则匹配" onclick="txt.innerHTML += method_new()">
    <div id="txt"></div><SCRIPT LANGUAGE="JavaScript">
    var txt = document.getElementById("txt");
    var n, a = new Array();function array_init()
    {
        n = parseInt(document.getElementById("count").value);
        a.length = 0;
        for(var i=0; i<n; i++)
        {
          a[i] = Math.random() +"";
        }
        return "数组长度:"+ n;
    }function method_old()
    {
        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_new()
    {
        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>
      

  6.   

    这是用meizz后来给的程序做的
    数组长度:10000
    传统循环法耗时 719 毫秒!检索的结果:检索到 1 个记录!
    正则匹配法耗时 16 毫秒!检索的结果:检索到 1 个记录!
    传统循环法耗时 718 毫秒!检索的结果:检索到 1 个记录!
    正则匹配法耗时 31 毫秒!检索的结果:检索到 1 个记录!
      

  7.   

    在 Firefox 里由于浏览器没有针对正则表达式作优化,导致使用正则表达式的匹配效率不高。
      

  8.   

    我也做了几个测试
    a[i] = Math.random() +"";
    a[i]=Math.random().toString();
    在IE速度差不多。在join里
    大梅用的是这个字符吧,我想javascript本身是unicode编码会不会用其他编码速度有影响,用了其他方法好象没什么区别
    var s = a.join("\x0f");还有用正则匹配的方法,多点几下有的时候时间会有多少的变化吧
    基本都是相差16的倍数。说了很多没用的,呵呵。
      

  9.   

    现在在这里不能测试firefox,手边没工具,没办法
      

  10.   

    从meizz(梅花雪)和emu(祝福后山)的代码里看可以看出:javascript里,对字符串的操作 .indexOf() 效率不如用 正则表达式高但这个与数组应该没有什么关系吧,只是因为多次执行了indexOf(),所以速度慢了但是小弟有一个疑问是:为什么 emu(祝福后山) 的以下代码,我测试的时候速度会很慢呢?这个和meizz(梅花雪)写的正则表达式算法不是一样的吗?不知道你们是不是也发现这个问题了~~function meizz(){
    var begin = new Date().getTime();
    var ch = "\x0f"
    var s = a.join(ch);
    var r = new RegExp("0\\.999[^\\"+ch+"]+", "g");
    var b = s.match(r);   s = "";
    return "正则匹配法耗时 "+ (new Date().getTime() - begin)
    +" 毫秒!检索到 "+ b.length +" 个记录!</strong><BR>";
    }
      

  11.   

    TO:  zhoubx(小狼) 这都是 emu 搞得鬼,我在初始华数组的时候已经把数组项转换为字符型的了,a[i] = Math.random() +""; 而在 emu 的例子里还是使用数字型,所以在用正则表达式join()的时候有一步隐性转换成字符串的过程var s = a.join(ch);,你把这句代码提到时间起点 begin 之前,或者事先就将数组子项定义成字符型就不会有正则效率差的现象了。
      

  12.   

    >> TO:  zhoubx(小狼) 这都是 emu 搞得鬼,我在初始华数组的时候已经把数组项转换为字符型的了,a[i] = Math.random() +""; 而在 emu 的例子里还是使用数字型,所以在用正则表达式join()的时候有一步隐性转换成字符串的过程var s = a.join(ch);,你把这句代码提到时间起点 begin 之前,或者事先就将数组子项定义成字符型就不会有正则效率差的现象了。呵呵Meizz又在骗小朋友了。join是match的前提,也就是检索过程的第一步,怎么可以不计算在检索时间里面呢?至于join的时候是否因为转换类型而多耗了时间,还是让试验来说话吧:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> test join </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="emu">
    </HEAD><BODY>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var n = 500000
    var a = new Array(n)
    function test(){
    for(var i=0;i<n;i++)
    a[n]=Math.random(); var d = new Date();
    var st = a.join("\x0f");
    alert(new Date()-d) for(var i=0;i<n;i++)
    a[n]=Math.random()+""; var d = new Date();
    var st = a.join("\x0f");
    alert(new Date()-d)}
    //-->
    </SCRIPT>
    <button onclick="test()">test</button>
    </BODY>
    </HTML>
      

  13.   

    哈哈上面的测试两个地方敲错了一个,是我的错。梅花雨的结论是对的。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> test join </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="emu">
    </HEAD><BODY>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var n = 50000
    var a = new Array(n)
    function test(){
    for(var i=0;i<n;i++)
    a[i]=Math.random(); var d = new Date();
    var st = a.join("\x0f");
    alert(new Date()-d) for(var i=0;i<n;i++)
    a[i]=Math.random()+""; var d = new Date();
    var st = a.join("\x0f");
    alert(new Date()-d)}
    //-->
    </SCRIPT>
    <button onclick="test()">test</button>
    </BODY>
    </HTML>唉,肥手指
      

  14.   

    >> 上面的测试两个地方敲错了一个,是我的错。梅花雨的结论是对的。
    上面的测试两个地方敲错了一个字母,是我的错。梅花雨的结论是对的。怎么就改不了这个肥手指呢?
      

  15.   

    >> 上面的测试两个地方敲错了一个字母,是我的错。梅花雨的结论是对的。
    >> 怎么就改不了这个肥手指呢?
     emu(祝福后山) 在這裡敲錯道沒什麼問題,可以很快改過來,但有些問題就麻煩:東莞市石碣鎮交通局一個姓陳的判官,在接手一次交通事故中,第一個星期說被撞人有理,第二個星期說被撞人無理,真是自己打自己的嘴巴,分明就是欺軟怕硬,收了本地人的好處,欺負外地人。後來給那外地人心裡留下了很深的陰影。沒戴頭盔的摩托車司機以飛快的速度撞到經過十字路口的行人,路上留下了道近十米的剎車痕,後來把頭給撞破了,那姓陳的矮胖官伙,開始說那本地人不尊守交通規則,過了一個星期再叫去說行人在沒人行斑馬條的路口要讓機動車,所以責任在行人。
    天哪,哪時他不要步行過馬路,不然的話開飛車撞飛那吃得肥流油的陳叛官,依他說的“有理”。說離題了,聽到“弄錯”一詞,想起了四年前記憶還是猶新的同學被撞場面。
      

  16.   

    >>emu(祝福后山) 在這裡敲錯道沒什麼問題,可以很快改過來,但有些問題就麻煩:这有什么可比性吗?emu犯了技术错误,会第一时间自己纠正、声明、道歉、挽回后果,所以emu犯的错误再严重,也是人犯的错误,人嘛,总会犯错误。那位判官通知犯的错误,能叫人犯的错误吗?居然把emu和这样的物种相提并论!
      

  17.   

    嗯,我想问问。同样是大容量数组。为什么一个不会报Out Of Memory错,一个要报呢? 不好意思有点偏题。var n = 500000;
    var a = new Array(n);
    for(var i = 0; i < n; i++) a[n] = Math.random();上面这个50w的ok。var a = new Array(
    "aaa",
    "aaa",
    "aaa",
    ...
    "aaa"
    );这个哪怕只有10w个元素都会报错。Any idea?  Thanks!
      

  18.   

    下面这里是生成新的表格列的函数也需要优化,请求高手指点// Function : Create Table
                            function createTable(){  
                                    document.getElementById("Detail").dataSrc="";   // release from  Data Binding 
                                    var strtd=""; //faster
                    
                                    var etTypeXml= BaseXmlDom.selectNodes("//root/ettype");  //按照提成类别fname排
                                    var detailXml = XmlDomDetail.selectNodes("//root/PROCOMM_DETAIL"); // 那么新的XML新节点也应该按照提成类别fname排
                                    var mtXmllen = etTypeXml.length;  //  3 ettypes
                                    var lendetail = detailXml.length;  // 4 childnodes
                                    var widHead = 40/mtXmllen;                                
                                    
                                    //Create thead top
                                    var strTmp111 = " ,";
                                    var strTmp112 = "15,"
                                    
                                    for (var i=0;i<mtXmllen;i++)  //  mtXmllen=3                                         
                                            {
                                                    var mtName= etTypeXml(i).getAttribute("FNAME");
                                                    strTmp111 +=  "" + ",";       //  (ettypeID) hide column ,to save ettype
                                                    strTmp111 +=  mtName + ",";
                                                    strTmp111 +=  "" + ","; 
                                                    
                                                    strTmp112 +=  "0" + ","    ;   // (ettypeID) hide column,width:1
                                                    strTmp112 +=  widHead + ",";    
                                                    strTmp112 +=  widHead + ",";
                                            }        
                                            
                                     strTmp111 +=  "" + "," + "" + ",";         // fscid
                                     strTmp112 +=  "0" + "," + "0" + ",";  //fproductid
                                     
                                     strTmp111 = strTmp111.substring(0,strTmp111.length-1);
                                     strTmp112 = strTmp112.substring(0,strTmp112.length-1);
                                     
                                     var arr111=strTmp111.split(",");   
                                     var arr112=strTmp112.split(",");
                                    
                                            
                                            for(var j=0;j<arr111.length;j++) //12
                                                    {
                                                            tdobj=document.createElement("TD");
                                                            tdobj.style.width=arr112[j]+"%";
                                                            with(tdobj)
                                                                    {
                                                                            if (j!=0 && ( (j+2 ) % 3 )==0  )         // j不为0且 模为0时才执行
                                                                                    {
                                                                                            strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' >" + arr111[j] + "</div>";
                                                                                    }
                                                                                    else
                                                                                    {
                                                                                            strtd = "<font color='#FFFFFF' size='2px'>" + arr111[j] + "</font>";
                                                                                    }
                                                            
                                                                    }
                                                            tdobj.innerHTML=strtd;        
                                                            document.all.mytop.appendChild(tdobj);
                                                    }
                                    
                                    //Create thead myhead        
                                            
                                    strTmp111 = "产品名称,";
                                    strTmp112 = "15,"
                                    
                                    for (var i=0;i<mtXmllen;i++)  //                                 
                                            {
                                                    var mtName= etTypeXml(i).getAttribute("FNAME");
                                                    strTmp111 +=  "" + ",";   // hide column ,to save ettype
                                                    strTmp111 +=  "原标准,";
                                                    strTmp111 +=  "调整金额,"; 
                                                    
                                                    strTmp112 +=  "0" + ","    ;  // hide column,width:1
                                                    strTmp112 +=  widHead + ",";
                                                    strTmp112 +=  widHead + ",";
                                            }        
                                            
                                     strTmp111 +=  "" + "," + "" + ",";           // hide column,to save fscid
                                     strTmp112 +=  "0" + "," + "0" + ",";  // hide column,to fproductid
                                     
                                     strTmp111 = strTmp111.substring(0,strTmp111.length-1);
                                     strTmp112 = strTmp112.substring(0,strTmp112.length-1);
                                     
                                     var arr111=strTmp111.split(",");   
                                     var arr112=strTmp112.split(",");
                                            
                                            for(var j=0;j<arr111.length;j++) //12
                                                    {
                                                            tdobj=document.createElement("TD");
                                                            tdobj.style.width=arr112[j]+"%";
                                                            with(tdobj)
                                                                    {
                                                                                    if (j!=0 && ( (j+2 ) % 3 )==0  )         // j不为0且 模为0时才执行
                                                                                    {
                                                                                            strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' >" + arr111[j] + "</div>";
                                                                                    }
                                                                                    else
                                                                                    {
                                                                                            strtd = "<font color='#FFFFFF' size='2px'>" + arr111[j] + "</font>";
                                                                                    }
                                                                            
                                                                    }
                                                            tdobj.innerHTML=strtd;        
                                                            document.all.myhead.appendChild(tdobj);
                                                    }
      

  19.   

    //Create tbody
                                     
                                            strTmp111="FPRODUCTNAME,";
                                            strTmp112="15,";
                                            
                                            for (var i=0;i<mtXmllen;i++)  //  for: the num of ettype                                        
                                            {
                                                    strTmp111 +=  "FCTYPE_" + i + ",";   // hide column ,to save ettype
                                                    strTmp111 +=  "FMONEY_" + i + ",";
                                                    strTmp111 +=  "FCHGMONEY_" + i +","; 
                                                    
                                                    strTmp112 +=  "0" + ","    ;                 // hide column, width:0
                                                    strTmp112 +=  widHead + ",";
                                                    strTmp112 +=  widHead + ",";
                                            }        
                                            
                                            
                                            strTmp111 +=  "FSCID" + "," + "FPRODUCTID" + ",";         // fscid
                                            strTmp112 +=  "0" + "," + "0" + ",";   
                                            
                                            strTmp111 = strTmp111.substring(0,strTmp111.length-1);
                                        strTmp112 = strTmp112.substring(0,strTmp112.length-1);        
                                                
                                            arr111=strTmp111.split(",");
                                            arr112=strTmp112.split(",");
                                            
                                                    for (var j=0;j<arr111.length;j++)  //the length of array 
                                                            {
                                                                    tdobj=document.createElement("TD");
                                                                    tdobj.style.width=arr112[j]+ "%";
                                                                    with(tdobj)
                                                                            {
                                                                                    
                                                                                    if (j!=0 && (j % 3 )==0   )          //模3是因为每对应一个门店类别有三列记录 %  http://livedocs.macromedia.com/d ... p;file=08_ope27.htm
                                                                                    {
                                                                                            strtd = "<input name='chgmoney' style='border-style:groove;width:40px'  type='text' dataFld= '" + arr111[j] + "' onclick='javascript:this.focus();this.select();' onblur='checkNum(this)' ></input>";
                                                                                    }
                                                                                    else if (( j==(3 * mtXmllen+1 ) ) || (j== (3 * mtXmllen+2) ) )    
                                                                                    {
                                                                                            strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' dataFld= '" + arr111[j] + "'></div>";
                                                                                    }
                                                                                    else if (j!=0 && ( (j+2 ) % 3 )==0  )          
                                                                                    {
                                                                                            strtd = "<div style='DISPLAY: none; VISIBILITY: hidden; OVERFLOW: hidden; WIDTH: 0px' >" + arr111[j] + "</div>";
                                                                                    }        
                                                                                    else
                                                                                    {
                                                                                            strtd = "<div style='width:98%;' dataFld= '" + arr111[j] + "'></div>";
                                                                                    }
                                                                            }
                                                                    tdobj.innerHTML=strtd;        
                                                                    document.all.mydata.appendChild(tdobj);        
                                                            }
                                            
                                            document.getElementById("Detail").dataSrc="#XmlDomDetail"; // rebilding
                                            //数据绑定完毕解控件过程在readystate中
                                            /*2005-12-28暂时方案*/
                                            document.myform.style.cursor="default" ;
                                            form_enable(true);
                                            window.parent.frames("fleft").document.all("LockUI").style.display="none";
                                    
                                    }
      

  20.   

    因为接触的数据量一般都在10W条以上,我就一直用数组输出成字符串方式检索,比循环检索快NN多也不用正则,直接在asp中使用instr函数查找
      

  21.   

    instr 只适合搜索在不在这个字符串里,而不适合在数据里取出多个符合条件的结果