emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks

           author:emu(黃希彤)Groovy 學習筆記3 運行效率 初識Rhino 中都用8皇后問題來比較java,javascript,groovy和Rhino 的運行效率。一開始考慮到8皇后只有92組解,輸出占用的時間應該很少,為了好看就把全部結果打印出來了。

          后來因為程序運行的太快,又增加了皇后的數目,用9皇后來測試,這樣需要輸出352個解了,我仍然沒有意識到輸出對運行時間的影響。直到今天中午多放了一個皇后的時候,才意識到問題的嚴重性:java版運行10皇后如果不輸出結果只需要30~40毫秒,而輸出結果的情況下需要500毫秒左右,輸出成了速度瓶頸。吧前面的測試全部去掉結果輸出部分重新測一遍吧:


          java版:

          public class queens {
              
          static int q=10;
              
          static int[] i=new int[q];
              
          static int count=0;
              
          public static void main(String[] args){
                  
          long t = System.currentTimeMillis();
                  scan(
          0);
                  System.
          out.println("totle results:"+count);
                  System.
          out.println("totle time:"+(System.currentTimeMillis()-t));
              }

              
          private static void scan(int n){
                  
          if (n==q){
          //            for (int k=0;k<q;k++) System.out.print(i[k]+(k==q-1?"\n":","));
                      count++;
                      
          return;
                  }

                  i[n]
          =0;
                  
          while(i[n]<q){
                      i[n] 
          = i[n]+1;
                      
          if (check(n)){
                          scan(n
          +1);
                      }

                  }

              }

              
          private static boolean check(int n){
                  
          for(int j=0;j<n;j++){
                      
          if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j ){
                          
          return false;
                      }

                  }

                  
          return true;
              }

          }



          javascript(DHTML)版

          <SCRIPT LANGUAGE="JavaScript">
          <!-- 
          var q=10 
          var i=[] 
          var count=0 
          var d = new Date(); 
          scan(
          0
          document.write(
          "totle results:"+count+"<br>"
          document.write(
          "time used:"+(new Date()-d)+"<br>"

          function scan(n)
              
          if (n==q)
          //        document.write(i+"<br>") 
                  count++ 
                  
          return 
              }
           
              i[n]
          =0 
              
          while(i[n]<q){
                  i[n] 
          = i[n]+1 
                  
          if (check(n)){
                      scan(n
          +1
                  }
           
              }
           
          }
           

          function check(n)
              
          for (var j=0; j<n;j++)
                  
          if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
                      
          return false  
              
          return true 
          }
           
          //--> 
          </SCRIPT> 


          groovy版

          int q=10
          int[] i=new int[q]
          int count=0
          long t = System.currentTimeMillis();
          scan(
          0)
          println(
          "totle results:"+count)
          println(
          "totle time:"+(System.currentTimeMillis()-t));
          def scan(n)
          {
              
          if (n==q){
          //        println(i.toList())
                  count++
                  
          return
              }

              i[n]
          =0
              
          while(i[n]<q){
                  i[n] 
          = i[n]+1
                  
          if (check(n))
                      scan(n
          +1)
              }

          }

          def check(n)
          {
              
          if (n>0)
                  
          for (j in 0..<n) 
                      
          if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
                          
          return false
              
          return true
          }


          javascript(Rhino)版

          var q=10
          var i
          =[] 
          var count
          =0 
          var d 
          = new Date(); 
          scan(
          0
          print(
          "totle results:"+count) 
          print(
          "time used:"+(new Date()-d)) 

          function scan(n)

              
          if (n==q)
          //        print(i) 
                  count++ 
                  
          return 
              }
           
              i[n]
          =0 
              
          while(i[n]<q){
                  i[n] 
          = i[n]+1 
                  
          if (check(n)){
                      scan(n
          +1
                  }
           
              }
           
          }
           

          function check(n)

              
          for (var j=0; j<n;j++)
                  
          if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
                      
          return false  
              
          return true 
          }
           


          其中javascript版由于在IE上運行的時間剛好超過5秒,會收到一個警告,所以是在firefox上測的。


          在我的筆記本上測試結果是:
          java 版:
          ---------- run ----------
          totle results:724
          totle time:40
          Normal Termination
          輸出完成(耗時 0 秒)。


          javascript(DHTML)版
           totle results:724
          time used:4977

          groovy版

          用groovy命令運行:
          ---------- run ----------
          totle results:724
          totle time:31095
          Normal Termination
          輸出完成(耗時 32 秒)。

          用groovyconsole運行或者編譯成java class后用java命令運行的結果也差不多,都在30~36秒之間。


          javascript(Rhino)版
          ---------- run ----------
          totle results:724
          time used:3685
          Normal Termination
          輸出完成(耗時 4 秒)。

          結果是:Rhino運行javascript腳本比firefox快一點(而firefox似乎又比IE快一點),總的來說,在這個測試上javascript比java慢一個數量級,而groovy則比javascript慢一個數量級author:emu(黃希彤)

          posted on 2005-06-22 14:30 emu 閱讀(2736) 評論(7)  編輯  收藏

          評論

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-06-30 15:21 emu
          昨天自己做了一點點優化:
          function check(n){
          for (var j=0; j<n;j++)
          if (i[j]==i[n] || i[j]-i[n]==j-n || i[j]-i[n]==n-j )
          return false
          return true
          }

          改為

          function check(n){
          for (var j=0,c=i[n],b=n; j<n;j++,b--){
          var d = i[j];
          if (d==c) return false
          var a = d-c
          if (a==b||a==-b) return false
          }
          return true
          }

          只是少訪問幾次數組,少做幾次減法運算,好像差別不大。但是由于check函數處在循環的最里層,優化的結果是在Rhino下面算11皇后的時候快了一倍左右,在cscript下面沒有那么突出,但也明顯也快了不少。  回復  更多評論
            

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-11-24 17:23 yorry
          請問如何在rhino中使用瀏覽器對象?謝謝。  回復  更多評論
            

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-11-25 18:08 emu
          只有在瀏覽器中運行腳本的時候才能訪問瀏覽器對象。
          有的時候我們想在非瀏覽器的上下文中測試一個函數的功能,可以用腳本模擬一個navigator、window或者document對象并賦相應的屬性和模擬的方法進去。  回復  更多評論
            

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-11-28 11:15 yorry
          也就是rhino本身并沒有提供模擬出瀏覽器上下文這樣的功能?看來rhino果然和瀏覽器不直接發生交互。  回復  更多評論
            

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-11-28 22:20 emu
          很多人都把DHTML當成是JAVASCRIPT,把window、document、body當成javascript語言提供的內嵌對象。其實不但rhino,其他javascript引擎本身也都不支持瀏覽器對象的。玩過cscript/wscript嗎?
            回復  更多評論
            

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-12-02 14:35 sheerfreedom
          emu 瀏覽器對象到底怎么模擬呢 ?

          比如說document對象

          能給個例子看看嗎 ?  回復  更多評論
            

          # re: java,javascript,groovy和Rhino 的運行效率到底相差的有多遠? 2005-12-02 14:56 emu
          這要看測試范圍了,單一個document每什么好測的,要模擬的話 var document=new Object(); 就可以了。要測試它的相關屬性和方法就要用腳本構造出來。比如我們有一個函數要修改document的title屬性:

          function changeTitle(){
          // 這是被測試的函數,其中使用了document對象的title屬性
          document.title += " -- emu";
          }

          我們可以這樣測試它:

          var document=new Object();//模擬document對象
          document.title = "試一試";//模擬title屬性
          changeTitle();
          if(document.title=="試一試 -- emu")
          WScript.Echo("函數changeTitle測試通過") ;
          else
          WScript.Echo("函數changeTitle測試失敗") ;

          注意到這里用了WScript.Echo輸出,直接在cscript或者wscript腳本宿主中運行就可以了。如果用rhino的話就print。  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 莲花县| 白银市| 师宗县| 嵊州市| 翼城县| 阳东县| 衡阳市| 同心县| 南木林县| 崇左市| 平邑县| 武鸣县| 平乡县| 依兰县| 高青县| 淮南市| 夏津县| 吉水县| 崇义县| 德庆县| 鄄城县| 含山县| 淮阳县| 江阴市| 苏尼特左旗| 阳朔县| 蓬莱市| 呼和浩特市| 西乌珠穆沁旗| 松阳县| 深水埗区| 宜丰县| 师宗县| 仙游县| 饶阳县| 新乡县| 泽库县| 鹿泉市| 隆林| 勃利县| 日土县|