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

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

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

    隨筆-57  評論-129  文章-0  trackbacks-0
    前幾天無意中看到一個網友blog上關于這個循環效率的問題,說要盡量避免使用。
    有點害怕,我在JSI中可是用了不少,呵呵。
    測試一下,負擔終于可以放下來了:

    測試對象:
    一個對象模擬map,測試for in 循環
    兩個數組,測試for(;;)循環

    連續4次運行時間比。
    957/1278;955/1357;1014/1282;968/1392


    明顯,要實現類似map的功能,還是for in 快點。

    上面的數據是ff2上的結果,ie7上也差不多,差距更小一點。

    測試代碼:
    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) 評論(13)  編輯  收藏 所屬分類: JavaScript

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

    這樣的一個對比應該是稍稍合理一點點的:

    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)

    但是事實上,兩個循環仍在相互干擾,試試簡單的把一個循環的數據構造和遍歷都完整的去掉,另一個立刻就會體現出來不同:

    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)

      回復  更多評論
      
    # re: 關于javascript for in 循環效率的疑惑 2007-06-03 18:45 | 金大為
    @emu
    其實,我認為你的回復也不夠嚴謹.
    new Date的開銷沒錯,但是基本可以忽略,而且沒有偏向任何一方.

    開銷是均攤的.
    就算你的瀏覽器new Date有點耗時,甚至取的時間不夠準,這種誤差,通過了多次測試來平衡.

    不過,循環反轉確實對效率有影響.
    但是,循環反轉只是對后者的,是否需要優化之后測試.也不知道那個更加公平,畢竟我們平時的編碼,都懶得去反轉.

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

    通過對腳本合并編譯實現  回復  更多評論
      
    # re: 關于javascript for in 循環效率的疑惑 2007-12-31 16:51 | java綜合網
    http://www.javazh.cn
    不錯,不錯  回復  更多評論
      
    主站蜘蛛池模板: 91手机看片国产永久免费| 国产中文字幕在线免费观看| 成人免费福利视频| 久久亚洲AV无码精品色午夜麻豆| 久久国产乱子伦精品免费强| 亚洲国产精品无码久久久秋霞2 | 亚洲精品无码久久久久APP | 黄色成人免费网站| 亚洲综合视频在线观看| 亚洲精品在线免费观看视频 | 亚洲欧洲另类春色校园小说| 亚洲成人免费网站| 亚洲日韩国产精品乱-久| 女人18毛片a级毛片免费视频| 国产亚洲大尺度无码无码专线| 亚洲一区二区三区免费| 亚洲Av无码专区国产乱码DVD| 国产白丝无码免费视频| 亚洲av高清在线观看一区二区| 免费无码一区二区| 亚洲精品乱码久久久久久| 99在线免费观看视频| 亚洲三级视频在线| 手机看片久久国产免费| 国产成人精品免费大全| 亚洲电影免费在线观看| 在线观看国产一区亚洲bd| 波多野结衣视频在线免费观看| 久久国产精品免费| 亚洲成a人不卡在线观看| 嫩草影院在线免费观看| jizz免费观看| 亚洲国产精品久久网午夜 | 日韩人妻无码精品久久免费一| 亚洲精品美女久久久久9999| 精品无码国产污污污免费| 亚洲免费人成在线视频观看 | 亚洲电影一区二区| 免费无码不卡视频在线观看| 东北美女野外bbwbbw免费| 亚洲H在线播放在线观看H|