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

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

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

    emu in blogjava

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      171 隨筆 :: 103 文章 :: 1052 評(píng)論 :: 2 Trackbacks

     

    第一篇筆記里面,我說(shuō)groovy運(yùn)行的居然還滿(mǎn)快的,其實(shí)是個(gè)誤會(huì)了。我上次做八皇后還是在8080上面用basic做的,和現(xiàn)在奔四上面的groovy相比是沒(méi)有意義的。特地又做了個(gè)對(duì)比試驗(yàn):

     

     1int q=9
     2int[] i=new int[q]
     3int count=0
     4long t = System.currentTimeMillis();
     5scan(0)
     6println("totle results:"+count)
     7println("totle time:"+(System.currentTimeMillis()-t));
     8def scan(n){
     9    if (n==q){
    10        println(i.toList())
    11        count++
    12        return
    13    }

    14    i[n]=0
    15    while(i[n]<q){
    16        i[n] = i[n]+1
    17        if (check(n))
    18            scan(n+1)
    19    }

    20}

    21def check(n){
    22    if (n>0)
    23        for (j in 0..<n) 
    24            if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
    25                return false
    26    return true
    27}


    運(yùn)行結(jié)果是:totle time:7271 (為了用groovy控制臺(tái)運(yùn)行的,直接用groovy命令運(yùn)行還要慢一點(diǎn))

    java呢?

    queens.java:

     

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

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

    17        i[n]=0;
    18        while(i[n]<q){
    19            i[n] = i[n]+1;
    20            if (check(n)){
    21                scan(n+1);
    22            }

    23        }

    24    }

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

    30        }

    31        return true;
    32    }

    33}

    34

    運(yùn)行結(jié)果是:totle time:271




    每次運(yùn)行花費(fèi)的時(shí)間略有不同,groovy和java的運(yùn)行速度看來(lái)大致相差10~30倍左右。


    能說(shuō)這是腳本語(yǔ)言天生的缺陷嗎?我們來(lái)看看同樣是類(lèi)似java語(yǔ)法的腳本語(yǔ)言javascript在IE里面的速度:

     1var q=9 
     2var i=[] 
     3var count=0 
     4var d = new Date(); 
     5scan(0
     6document.write("totle results:"+count+"<br>"
     7document.write("time used:"+(new Date()-d)+"<br>"
     8
     9function scan(n)
    10    if (n==q)
    11        document.write(i+"<br>"
    12        count++ 
    13        return 
    14    }
     
    15    i[n]=0 
    16    while(i[n]<q){
    17        i[n] = i[n]+1 
    18        if (check(n)){
    19            scan(n+1
    20        }
     
    21    }
     
    22}
     
    23
    24function check(n)
    25    for (var j=0; j<n;j++)
    26        if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
    27            return false  
    28    return true 
    29}
     






    運(yùn)行結(jié)果是: time used:1241
    比groovy快了5倍以上。groovy可真是夠慢的。


    把groovy編譯的class文件反編譯了一下,看到groovy生成的代碼效率確實(shí)是太低了,我們就看循環(huán)最內(nèi)層的check函數(shù)吧:


    1def check(n){
    2    if (n>0)
    3        for (j in 0..<n) 
    4            if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
    5                return false
    6    return true
    7}


     


    編譯后變成



     1    public Object check(Object obj)
     2    {
     3        if(ScriptBytecodeAdapter.compareGreaterThan(obj, new Integer(0)))
     4        {
     5            Object obj1 = null;
     6            for(Iterator iterator = ScriptBytecodeAdapter.asIterator(ScriptBytecodeAdapter.createRange(new Integer(0), obj, false)); iterator.hasNext();)
     7            {
     8                Object obj2 = iterator.next();
     9                Object obj3 = null;
    10                if(ScriptBytecodeAdapter.asBool(ScriptBytecodeAdapter.asBool(ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
    11    obj2
    12}
    ))), ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
    13    obj
    14}
    )))) || ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
    15    obj2
    16}
    ))), "minus", ((Object) (new Object[] {
    17    ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
    18        obj
    19    }
    )))
    20}
    ))), ScriptBytecodeAdapter.invokeMethod(obj2, "minus", ((Object) (new Object[] {
    21    obj
    22}
    )))) ? ((Object) (Boolean.TRUE)) : ((Object) (Boolean.FALSE))) || ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
    23    obj2
    24}
    ))), "minus", ((Object) (new Object[] {
    25    ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
    26        obj
    27    }
    )))
    28}
    ))), ScriptBytecodeAdapter.invokeMethod(obj, "minus", ((Object) (new Object[] {
    29    obj2
    30}
    )))) ? ((Object) (Boolean.TRUE)) : ((Object) (Boolean.FALSE))))
    31                    return Boolean.FALSE;
    32            }

    33
    34        }

    35        return Boolean.TRUE;
    36    }

    37




     

    一切都是object,做任何事情都是invokeMethod,兩個(gè)整數(shù)的比較居然要寫(xiě)將近400個(gè)字符的代碼,光看代碼量都可以嚇倒我了。這是我們期待的腳本語(yǔ)言嗎?


    groovy可以嵌入到j(luò)ava代碼里面,但是java代碼可以嵌入到groovy里面嗎?我覺(jué)得groovy有必要提供這樣一種機(jī)制,在有必要的時(shí)候可以消除性能瓶頸。可是現(xiàn)在只看到groovy里面可以通過(guò)Scriptom(現(xiàn)在還是beta版)嵌入vbs、js腳本(包括使用WSH,FSO)或者調(diào)用InternetExplorer、Media Player、Word和Excel等windows組件。看來(lái)對(duì)消除性能瓶頸的幫助不大。

    posted on 2005-05-18 18:19 emu 閱讀(6223) 評(píng)論(13)  編輯  收藏 所屬分類(lèi): Groovy 學(xué)習(xí)筆記

    評(píng)論

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-06-28 20:38 water
    在Java的世界里, 性能不是最主要的, 開(kāi)發(fā)效率反而更重要些  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-06-30 09:57 emu
    不錯(cuò),性能不是最主要的,但是并不意味著性能問(wèn)題不需要考慮。groovy并不只是用來(lái)開(kāi)發(fā)原型的。

    我們不做這個(gè)考察,在開(kāi)發(fā)的時(shí)候怎么會(huì)知道什么東西應(yīng)該用什么方式解決比較好呢。  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-09-29 16:17 abcd
    你可以試試看jython  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-10-01 00:45 陳朋奕
    jython不成熟……
    其實(shí)Java開(kāi)發(fā)并非開(kāi)發(fā)效率最主要,倒是要看什么項(xiàng)目了。而且如果Groovy二次編譯后的Java代碼變成這樣的話(huà),那么可以推測(cè)它跟C++的效率之比會(huì)有10萬(wàn)倍以上了。這樣的速度真的難以讓人接受,每個(gè)原生類(lèi)型都Object一下,然后實(shí)例化對(duì)象就invokeMethod……  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-10-03 17:04 順路走過(guò)
    腳本是膠水,而不是用來(lái)做計(jì)算密集型的東西。  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-10-04 14:58 emu
    不但腳本不是用來(lái)“做計(jì)算密集型的東西”的,java也不是c#也不是。正兒八經(jīng)說(shuō),高級(jí)語(yǔ)言都不是,匯編語(yǔ)言也只是勉強(qiáng)算是。不是用來(lái)“做計(jì)算密集型的東西”并非就可以把運(yùn)行效率完全丟開(kāi)一邊了。我們犧牲一些運(yùn)算效率來(lái)?yè)Q開(kāi)發(fā)效率是可以接受的,但是犧牲的太多了就不得不要斟酌一下了。

    秋水無(wú)恨解 http://m.tkk7.com/emu/category/2769.html 也是用的腳本呢。  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2005-10-26 17:37 cap的技術(shù)blog
    測(cè)試一下吧,我覺(jué)得這個(gè)是groovy+jvm自己的問(wèn)題, 看看python和ruby, 效率比groovy高不少啊, 不算現(xiàn)在的成熟版, 人家最初的那幾個(gè)版本一樣也是很快的,同樣是動(dòng)態(tài)語(yǔ)言, 為什么groovy玩得就這么慢呢?

      回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2006-06-22 09:49 哈哈的日子
    @emu

    非常支持下面這些話(huà)!

    //////////////////////////////////

    不但腳本不是用來(lái)“做計(jì)算密集型的東西”的,java也不是c#也不是。正兒八經(jīng)說(shuō),高級(jí)語(yǔ)言都不是,匯編語(yǔ)言也只是勉強(qiáng)算是。不是用來(lái)“做計(jì)算密集型的東西”并非就可以把運(yùn)行效率完全丟開(kāi)一邊了。我們犧牲一些運(yùn)算效率來(lái)?yè)Q開(kāi)發(fā)效率是可以接受的,但是犧牲的太多了就不得不要斟酌一下了。

    秋水無(wú)恨解 http://m.tkk7.com/emu/category/2769.html 也是用的腳本呢。 回復(fù)
      回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2006-07-11 17:24 甘先生
    支持 emu  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2007-04-21 10:40 zysuper
    雖然我已經(jīng)看透了groovy的小伎倆,但還是很希望他可以成長(zhǎng)起來(lái),現(xiàn)在的groovy實(shí)在是太嫩了  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2007-11-13 12:45 順路走過(guò)
    @emu
    兄弟,難道根本就不明白什么叫做計(jì)算密集型?
    求解np問(wèn)題從來(lái)就沒(méi)納入到計(jì)算密集型當(dāng)中。用的最多的都是微分方程方面的求解問(wèn)題,如氣象,核爆模擬等等。
    這類(lèi)問(wèn)題的解決思路都不是深度挖掘單節(jié)點(diǎn)的計(jì)算能力,而是集群計(jì)算的效能和帶寬。
      回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2007-11-13 16:07 emu
    呵呵樓上這位兄弟是專(zhuān)業(yè)的  回復(fù)  更多評(píng)論
      

    # re: Groovy 學(xué)習(xí)筆記3 運(yùn)行效率 2016-01-20 10:35 良好市民
    使用@CompileStatic,
    性能會(huì)好一些  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产成人精品日本亚洲专区61 | 大地资源在线观看免费高清| 亚洲国产综合人成综合网站| 亚洲av成人综合网| a级毛片毛片免费观看久潮喷| 国产福利免费观看| 亚洲一区二区久久| 久久久久免费看黄a级试看 | 亚洲另类图片另类电影| 在线观看人成视频免费无遮挡| 白白国产永久免费视频| 亚洲乱码在线播放| 久久一区二区三区免费播放| 国产精品亚洲综合一区| 精品亚洲av无码一区二区柚蜜| 在线看片v免费观看视频777| 久久国产亚洲观看| free哆拍拍免费永久视频| 国产精品四虎在线观看免费| 亚洲人成77777在线观看网| 69精品免费视频| 久久精品亚洲综合一品| 男女一边桶一边摸一边脱视频免费| 国产网站免费观看| 亚洲真人无码永久在线观看| 67194熟妇在线永久免费观看 | 91av免费观看| 亚洲AV无码乱码国产麻豆穿越 | 精品亚洲一区二区| fc2成年免费共享视频网站| 亚洲成av人在片观看| 精品国产_亚洲人成在线| 成人永久福利免费观看| 国产亚洲精品bv在线观看| 国产妇乱子伦视频免费| 亚洲精品无码久久久久久久| 最近免费字幕中文大全视频| 久久久久亚洲av无码专区喷水| 久久大香香蕉国产免费网站 | 农村寡妇一级毛片免费看视频| 国产精品免费小视频|