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

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

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


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

          上面的數(shù)據(jù)是ff2上的結(jié)果,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 金大為 閱讀(1508) 評論(13)  編輯  收藏 所屬分類: JavaScript

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

          這樣的一個對比應(yīng)該是稍稍合理一點點的:

          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)

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

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

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

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

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

          通過對腳本合并編譯實現(xiàn)  回復(fù)  更多評論
            
          # re: 關(guān)于javascript for in 循環(huán)效率的疑惑 2007-12-31 16:51 | java綜合網(wǎng)
          主站蜘蛛池模板: 涪陵区| 元谋县| 彰化县| 宁津县| 晋中市| 红河县| 玉环县| 乌恰县| 海安县| 武冈市| 岳普湖县| 吉安县| 全椒县| 天长市| 彭州市| 武宁县| 五常市| 东辽县| 静海县| 阿勒泰市| 酒泉市| 丰台区| 凯里市| 张家界市| 龙海市| 隆化县| 赤水市| 巴彦县| 华亭县| 桓台县| 曲松县| 旌德县| 武鸣县| 邢台市| 于都县| 平罗县| 太保市| 彭阳县| 黄大仙区| 木兰县| 闽侯县|