国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

JavaScript極速狂飆:大容量字符型數組的快速檢索

2024-04-27 13:55:08
字體:
來源:轉載
供稿:網友

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 冀州市| 永康市| 合作市| 诸城市| 龙陵县| 广东省| 高青县| 全州县| 泾川县| 石阡县| 黔西县| 岳池县| 万州区| 靖江市| 广灵县| 西盟| 潮州市| 上高县| 湾仔区| 海阳市| 渝北区| 邛崃市| 杂多县| 营口市| 武汉市| 芦山县| 夏津县| 汕尾市| 东方市| 江油市| 尚志市| 墨江| 佛山市| 武义县| 福泉市| 临江市| 揭西县| 双牌县| 白玉县| 吴江市| 巢湖市|