隨筆-57  評論-129  文章-0  trackbacks-0
          循環反轉示例:

            for(var i = 0;i<data.length;i++){
              
          //.
            }
            
          //反轉后代碼
            for(var i = data.length-1;i>=0;i--){
              
          //.
            }

          這類優化的作用是明顯的,但是具體有多大作用呢?

          用一個長度為100 000 的數組測試一下:
          515/313
          500/313
          516/312
          516/328
          516/328

          可見,循環反轉后,只需要原來3/5的時間.
          但是,這種東西到底有多大價值?FF上200次循環僅需要1毫秒的時間.所以,個人認為,只要循環的內容不是太長,使用不算非常頻繁,那么沒有太大必要.
          加入循環的長度需要通過函數取得,且不變,那么,反轉的效率還是可觀的,在IE上,函數調用消耗是普通操作的十多倍.

          測試代碼:
          var incTime = 0;
          var decTime = 0;
          var inc = 0;
          var data = new Array(10*10000);
          //while(inc++<50)
          {
            
          var t1 = new Date();
            
          for(var i = 0;i<data.length;i++){
            }
            
          var t2 = new Date();
            
          for(var i = data.length-1;i>=0;i--){
            }
            
          var t3 = new Date();
            incTime
          +=(t2-t1);
            decTime
          +=(t3-t2);
          }

          prompt(
          "incTime/decTime",incTime +'/'+decTime)


          posted on 2007-05-31 12:30 金大為 閱讀(923) 評論(5)  編輯  收藏 所屬分類: JavaScript

          評論:
          # re: javascript 性能測試系列:循環反轉的效果 2007-05-31 15:07 | MagicA
          是反轉產生的效果還是避免每次取length的效果?  回復  更多評論
            
          # re: javascript 性能測試系列:循環反轉的效果 2007-06-01 09:30 | DoubleHeart
          還真是執行效率的差別,不是取length的差別
          我把代碼改成這樣:

          var incTime = 0;
          var decTime = 0;
          var inc = 0;
          var data = new Array(10*10000);
          //while(inc++<50)
          {
          var t1 = new Date();
          for(var i = 0, num = data.length; i < num; i++){
          }
          var t2 = new Date();
          for(var i = data.length-1; i >= 0; i--){
          }
          var t3 = new Date();
          incTime+=(t2-t1);
          decTime+=(t3-t2);
          }

          alert("incTime/decTime => " + incTime +'/'+decTime);


          執行后,還是“反轉循環”后的執行效率要高不少,IE下基本上維持在1:3,FF3beta版下基本上維持在1:2的情況(倒序:順序)。  回復  更多評論
            
          # re: javascript 性能測試系列:循環反轉的效果 2007-06-01 10:20 | MagicA
          that is an interesting topic, let's do more
          1. 擴大data的元素,因為采樣太小的話,隨機性較強
          2. 把取length的代碼放在前面,脫離計時區域
          3. 試著顛倒兩個for的順序
          then you get the following conclusion
          . they are almost the same

          have a try

          ------------------------------------------------
          var incTime = 0;
          var decTime = 0;
          var inc = 0;
          var data = new Array(100*10000);
          //while(inc++<50)
          {
          var len = data.length;
          var t1 = new Date();
          for(var i = len; i > 0; i--){}
          var t2 = new Date();
          for(var i = 0; i < len; i++){}
          var t3 = new Date();
          incTime+=(t2-t1);
          decTime+=(t3-t2);
          }

          alert("incTime/decTime => " + incTime +'/'+decTime);  回復  更多評論
            
          # re: javascript 性能測試系列:循環反轉的效果 2007-06-01 17:22 | 金大為
          @DoubleHeart
          for(var i = 0, num = data.length; i < num; i++){
          }
          var t2 = new Date();
          for(var i = data.length-1; i >= 0; i--){

          你這樣是少取了一次屬性,但是,你還是取了一次變量,取變量估計也要比常量耗時的:)  回復  更多評論
            
          # re: javascript 性能測試系列:循環反轉的效果 2007-06-03 18:40 | 金大為
          @emu
          挑刺專家啊,你說的沒錯:

          不過對我來說,我一般懶得去申明那個變量,而且對于for循環,最常見的也就是對數組循環.所以我感覺我上面的測試還有有一定的常見性.
            回復  更多評論
            
          主站蜘蛛池模板: 鲜城| 左贡县| 衡水市| 崇义县| 和龙市| 遂平县| 阿拉善左旗| 绍兴市| 拉孜县| 武强县| 吉首市| 扎囊县| 卓尼县| 建平县| 广饶县| 本溪市| 额尔古纳市| 十堰市| 象山县| 和顺县| 虞城县| 永春县| 沈阳市| 西和县| 肇庆市| 肇东市| 繁峙县| 彭州市| 桐庐县| 富蕴县| 乐山市| 饶阳县| 吉水县| 赤水市| 赣州市| 临朐县| 保康县| 沙湾县| 台湾省| 香港| 武强县|