隨筆-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循環,最常見的也就是對數組循環.所以我感覺我上面的測試還有有一定的常見性.
            回復  更多評論
            
          主站蜘蛛池模板: 奉贤区| 大英县| 沐川县| 综艺| 施甸县| 平潭县| 个旧市| 阿合奇县| 沐川县| 吕梁市| 日照市| 同德县| 东乌| 莎车县| 龙南县| 三明市| 连城县| 清河县| 新河县| 绥江县| 青田县| 济源市| 安国市| 美姑县| 讷河市| 张北县| 东阿县| 海淀区| 汝阳县| 永宁县| 西乌珠穆沁旗| 揭阳市| 新巴尔虎右旗| 雷波县| 苗栗县| 广灵县| 宜春市| 亳州市| 高州市| 耿马| 临夏市|