<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-57  評(píng)論-129  文章-0  trackbacks-0
    前幾天無(wú)意中看到一個(gè)網(wǎng)友blog上關(guān)于這個(gè)循環(huán)效率的問(wèn)題,說(shuō)要盡量避免使用。
    有點(diǎn)害怕,我在JSI中可是用了不少,呵呵。
    測(cè)試一下,負(fù)擔(dān)終于可以放下來(lái)了:

    測(cè)試對(duì)象:
    一個(gè)對(duì)象模擬map,測(cè)試for in 循環(huán)
    兩個(gè)數(shù)組,測(cè)試for(;;)循環(huán)

    連續(xù)4次運(yùn)行時(shí)間比。
    957/1278;955/1357;1014/1282;968/1392


    明顯,要實(shí)現(xiàn)類似map的功能,還是for in 快點(diǎn)。

    上面的數(shù)據(jù)是ff2上的結(jié)果,ie7上也差不多,差距更小一點(diǎn)。

    測(cè)試代碼:
    function C(i){
      
    return i<62?
        String.fromCharCode(i
    +=
          i
    <26?65
            :i
    <52?71//97-26
              :-4//48-26-26
        )
          :i
    <63?'_'
            :i
    <64?'$'
              :C(i
    >>6)+C(i&63)
    }
    var map = {};
    var arr1 = [];
    var arr2 = [];

    for(var i = 0;i<1000;i++){
      
    var c = C(i);
      map[c] 
    = i;
      arr1.push(c);
      arr2.push(i);
    }
    var i = 0;
    var mapTime = 0;
    var arrTime = 0;
    var inc = 0
    while(inc++<500){
      
    var t1 = new Date();
      
    for(var n in map){
        n 
    = map[n];
      }
      
    var t2 = new Date();
      
    for(var j = 0;j<1000;j++){
        n 
    =arr1[j];
        n 
    =arr2[j];
      }
      
    var t3 = new Date();
      mapTime
    +=(t2-t1);
      arrTime
    +=(t3-t2);
    }

    prompt(
    "mapTime/arrTime",mapTime +'/'+arrTime)


    posted on 2007-05-27 17:18 金大為 閱讀(1500) 評(píng)論(13)  編輯  收藏 所屬分類: JavaScript

    評(píng)論:
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-05-27 17:26 | dreamstone
    不錯(cuò),很少研究js的效率。拜讀。。  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-05-27 19:16 | 金大為
    感覺(jué)JS這類腳本語(yǔ)言的效率不能拿一般的編譯型語(yǔ)言去類推,差別較大。
    解釋型,特別是js這種比較慢的解釋型語(yǔ)言,解釋時(shí)間大于運(yùn)行時(shí)間,所以,我們要記住一個(gè)原則,語(yǔ)句越少越好。能用原生的就不要自己寫。
    還有,js函數(shù)調(diào)用也是較大的開銷,不太復(fù)雜的,效率要求苛刻的,能inline就不要函數(shù)了。  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-03 16:12 | emu
    測(cè)試不夠嚴(yán)謹(jǐn):
    在循環(huán)中重復(fù)了1500次new Date()操作,這個(gè)構(gòu)造對(duì)象的代價(jià)算誰(shuí)的?
    每次new Date()后去相減后累加,這里每次得到的時(shí)間差有0~1/18.6秒的誤差。這個(gè)誤差在最后累加起來(lái),結(jié)果是筆糊涂帳。
    最后,如樓主在另一篇文章里面提到的,循環(huán)反轉(zhuǎn)也會(huì)影響結(jié)果(受教了:P)

    這樣的一個(gè)對(duì)比應(yīng)該是稍稍合理一點(diǎn)點(diǎn)的:

    var n,m;
    var inc = 0
    var t1 = new Date();
    while(inc++<500){
    for(var n in map){
    m = map[n];
    }
    }

    var t2 = new Date();
    inc=0;
    while(inc++<500){
    for(var j=arr1.length-1;j>=0;j--){
    n =arr1[j];
    m =arr2[j];
    }
    }
    var t3 = new Date();
    var mapTime=(t2-t1);
    var arrTime=(t3-t2);


    prompt("mapTime/arrTime",mapTime +'/'+arrTime)

    但是事實(shí)上,兩個(gè)循環(huán)仍在相互干擾,試試簡(jiǎn)單的把一個(gè)循環(huán)的數(shù)據(jù)構(gòu)造和遍歷都完整的去掉,另一個(gè)立刻就會(huì)體現(xiàn)出來(lái)不同:

    function C(i){
    return i<62?
    String.fromCharCode(i+=
    i<26?65
    :i<52?71//97-26
    :-4//48-26-26
    )
    :i<63?'_'
    :i<64?'$'
    :C(i>>6)+C(i&63)
    }
    var map = {};
    //var arr1 = [];
    //var arr2 = [];
    var n,m;
    for(var i = 0;i<1000;i++){
    var c = C(i);
    map[c] = i;
    // arr1.push(c);
    // arr2.push(i);
    }
    var inc = 0
    var t1 = new Date();
    while(inc++<500){
    for(var n in map){
    m = map[n];
    }
    }
    var t2 = new Date();
    /*
    inc=0;
    while(inc++<500){
    for(var j=arr1.length-1;j>=0;j--){
    n =arr1[j];
    m =arr2[j];
    }
    }
    */
    var t3 = new Date();
    var mapTime=(t2-t1);
    var arrTime=(t3-t2);


    prompt("mapTime/arrTime",mapTime +'/'+arrTime)

      回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-03 18:45 | 金大為
    @emu
    其實(shí),我認(rèn)為你的回復(fù)也不夠嚴(yán)謹(jǐn).
    new Date的開銷沒(méi)錯(cuò),但是基本可以忽略,而且沒(méi)有偏向任何一方.

    開銷是均攤的.
    就算你的瀏覽器new Date有點(diǎn)耗時(shí),甚至取的時(shí)間不夠準(zhǔn),這種誤差,通過(guò)了多次測(cè)試來(lái)平衡.

    不過(guò),循環(huán)反轉(zhuǎn)確實(shí)對(duì)效率有影響.
    但是,循環(huán)反轉(zhuǎn)只是對(duì)后者的,是否需要優(yōu)化之后測(cè)試.也不知道那個(gè)更加公平,畢竟我們平時(shí)的編碼,都懶得去反轉(zhuǎn).

    更正:上次回復(fù)沒(méi)有注意。
    這里循環(huán)反轉(zhuǎn)已經(jīng)沒(méi)有意義了。
    for(var j = 0;j<1000;j++){
    翻轉(zhuǎn)的意義只在中間判斷條件時(shí)用常量去判斷,不用取變量甚至屬性,而這里最大值已經(jīng)是常量,反轉(zhuǎn)也就完全沒(méi)有意義了。
    不知道你是這個(gè)例子沒(méi)看清楚還是上個(gè)測(cè)試沒(méi)看明白。  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-03 22:54 | emu
    new Date并不是沒(méi)有偏向任何一方,而是根本不知道偏向了哪一方。
    開銷的“均攤”導(dǎo)致了糊涂賬。好比我和李嘉誠(chéng)各花掉1萬(wàn)塊,我們的財(cái)富比例絕對(duì)會(huì)發(fā)生質(zhì)的變化,而不會(huì)“均攤”
    在“多次測(cè)試”過(guò)程中間,每次都重新引入一次的誤差,是無(wú)法通過(guò)增加測(cè)試次數(shù)來(lái)平衡的。
      回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-04 08:19 | 金大為
    @emu
    也不知道你靠什么腦袋吃飯的,轉(zhuǎn)不過(guò)彎來(lái)可以自己建個(gè)數(shù)學(xué)模型分析測(cè)試一下.
    Date的開銷不會(huì)改變時(shí)間的差距,不過(guò),對(duì)比率確實(shí)有一點(diǎn)影響.
    最后誰(shuí)重誰(shuí)輕是不會(huì)改變的.  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-04 09:34 | emu
    偶并沒(méi)有否定最后的結(jié)果,只是指出測(cè)試方式的不嚴(yán)謹(jǐn)而已。ok,偶是木頭腦瓜,樓主不喜歡聽不同意見,偶大可以不說(shuō)。  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-04 17:48 | 金大為
    @emu
    有價(jià)值的不同意見,我非常感激,沒(méi)有價(jià)值的意見,還是留個(gè)耳根清靜的好。
      回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-06-06 12:44 | hj
    通過(guò)拜讀樓主的幾篇文章發(fā)現(xiàn)樓主是個(gè)很有個(gè)性的人  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-07-16 11:27 | jarry
    我得試試,hoho  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-11-08 03:00 | 五彩閣
    如何能避免兩段JS代碼想到干擾呢  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-11-08 21:32 | 金大為
    @五彩閣
    看JSI http://www.xidea.org/project/jsi
    下一個(gè)版本的JSI將實(shí)現(xiàn)腳本的導(dǎo)出功能。
    就是說(shuō),JSI只作為一個(gè)開發(fā)期的框架。

    通過(guò)對(duì)腳本合并編譯實(shí)現(xiàn)  回復(fù)  更多評(píng)論
      
    # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-12-31 16:51 | java綜合網(wǎng)
    http://www.javazh.cn
    不錯(cuò),不錯(cuò)  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 中文字幕视频在线免费观看| 香蕉97碰碰视频免费| 在线免费中文字幕| 亚洲伊人色欲综合网| aaa毛片免费观看| 亚洲VA中文字幕不卡无码| 男人都懂www深夜免费网站| 亚洲AV无码国产精品色午友在线 | 亚洲综合色丁香婷婷六月图片| 成人免费激情视频| 亚洲xxxx18| 国产免费看插插插视频| 免费的黄网站男人的天堂 | 亚洲网站在线免费观看| 亚洲精品美女久久久久9999| 免费观看激色视频网站(性色)| 亚洲一日韩欧美中文字幕在线| 日日夜夜精品免费视频| 国产人成网在线播放VA免费| 亚洲国产精品国自产拍AV| 亚洲精品视频免费看| 亚洲第一成年免费网站| 国产a v无码专区亚洲av| 久久一区二区三区免费播放| 亚洲图片校园春色| 四虎影视在线永久免费观看| 精品一区二区三区免费视频| 久久久亚洲AV波多野结衣| 在线免费观看污网站| caoporn成人免费公开| 77777_亚洲午夜久久多人| 免费被黄网站在观看| 91视频精品全国免费观看| 亚洲视频小说图片| 午夜网站免费版在线观看| 中文字幕在线免费看线人| 99热亚洲色精品国产88| 亚洲一级黄色视频| 国产一卡二卡3卡四卡免费| 疯狂做受xxxx高潮视频免费| 亚洲综合精品香蕉久久网97|