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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0
    • ?盡可能使用堆棧變量

    ??????? 如果您頻繁存取變量,就需要考慮從何處存取這些變量。變量是 static 變量,還是堆棧變量,或者是類的實例變量?變量的存儲位置對存取它的代碼的性能有明顯的影響?例如,請考慮下面這段代碼:

    class ?StackVars
    {
    ??
    private ? int ?instVar;
    ??
    private ? static ? int ?staticVar;
    ??
    ??
    // 存取堆棧變量
    ?? void ?stackAccess( int ?val)
    ??
    {
    ????
    int ?j = 0 ;
    ????
    for ?( int ?i = 0 ;?i < val;?i ++ )
    ??????j?
    += ? 1 ;
    ??}

    ??
    ??
    // 存取類的實例變量
    ?? void ?instanceAccess( int ?val)
    ??
    {
    ????
    for ?( int ?i = 0 ;?i < val;?i ++ )
    ??????instVar?
    += ? 1 ;
    ??}
    ???
    ??
    ??
    // 存取類的?static?變量
    ?? void ?staticAccess( int ?val)
    ??
    {
    ????
    for ?( int ?i = 0 ;?i < val;?i ++ )
    ??????staticVar?
    += ? 1 ;
    ??}

    }
    ?????
    ????? 這段代碼中的每個方法都執(zhí)行相同的循環(huán),并反復(fù)相同的次數(shù)。唯一的不同是每個循環(huán)使一個不同類型的變量遞增。方法 stackAccess 使一個局部堆棧變量遞增,instanceAccess 使類的一個實例變量遞增,而 staticAccess 使類的一個 static 變量遞增。

    ????? instanceAccess 和 staticAccess 的執(zhí)行時間基本相同。但是,stackAccess 要快兩到三倍。存取堆棧變量如此快是因為,JVM 存取堆棧變量比它存取 static 變量或類的實例變量執(zhí)行的操作少。

    ??? 查看字節(jié)碼揭示了堆棧變量效率更高的原因。JVM 是一種基于堆棧的虛擬機(jī),因此優(yōu)化了對堆棧數(shù)據(jù)的存取和處理。所有局部變量都存儲在一個局部變量表中,在 Java 操作數(shù)堆棧中進(jìn)行處理,并可被高效地存取。存取 static 變量和實例變量成本更高,因為 JVM 必須使用代價更高的操作碼,并從常數(shù)存儲池中存取它們。(常數(shù)存儲池保存一個類型所使用的所有類型、字段和方法的符號引用。)

    ??? 通常,在第一次從常數(shù)存儲池中訪問 static 變量或?qū)嵗兞恳院螅琂VM 將動態(tài)更改字節(jié)碼以
    使用效率更高的操作碼。盡管有這種優(yōu)化,堆棧變量的存取仍然更快。

    ??? 考慮到這些事實,就可以重新構(gòu)建前面的代碼,以便通過存取堆棧變量而不是實例變量或
    static 變量使操作更高效。請考慮修改后的代碼:

    class?StackVars
    {
    ??
    //與前面相同
    ??void?instanceAccess(int?val)
    ??
    {
    ????
    int?j?=?instVar;
    ????
    for?(int?i=0;?i<val;?i++)
    ??????j?
    +=?1;
    ????instVar?
    =?j;
    ??}
    ??
    ??
    ??
    void?staticAccess(int?val)
    ??
    {
    ????
    int?j?=?staticVar;
    ????
    for?(int?i=0;?i<val;?i++)
    ??????j?
    +=?1;
    ????staticVar?
    =?j;
    ??}

    }
    ????
    ??? 方法 instanceAccess 和 staticAccess 被修改為將它們的實例變量或 static 變量復(fù)制到局部堆棧變量中。當(dāng)變量的處理完成以后,其值又被復(fù)制回實例變量或 static 變量中。這種簡單的更改明顯提高了instanceAccess 和 staticAccess 的性能。這三個方法的執(zhí)行時間現(xiàn)在基本相同,instanceAccess 和 staticAccess 的執(zhí)行速度只比 stackAccess 的執(zhí)行速度慢大約 4%。
    ?/*======== 循環(huán)的最佳化?========*/
    把循環(huán)
    ?for (int i = 0; i < 100; i++)
    ?{}
    改成
    ?for (int i = 99; i >= 0; i--)
    ?{}

    后,速度會更快,之所以會有效的提升,是因為如果數(shù)值要與0比較,在底層都有較簡單的指令可以應(yīng),也因此加速了程序的執(zhí)行。其它(> >= < <= !=)都可以這樣考慮.
    ??? String比StringBuffer節(jié)省內(nèi)存,但StringBuffer運(yùn)行速度比String快

    package?com;

    public?class?Test?
    {
    ?
    public?static?void?main(String[]?args)?
    ?
    {
    ??Runtime?rt?
    =?Runtime.getRuntime();
    ??
    long?start?=?rt.totalMemory()?-?rt.freeMemory();
    ??System.out.println(
    "memory?used?start:?"?+?start);??
    ??String?sum?
    =?"";
    ??
    for?(int?i?=?0;?i?<?5000;?i++)
    ??
    {
    ???sum?
    =?sum?+?"+"?+?i;
    ??}

    ??
    long?end?=?rt.totalMemory()?-?rt.freeMemory();
    ??System.out.println(
    "memory?used?end:?"?+?end);
    ??System.out.println(
    "總共消耗了內(nèi)存:?"?+?(end?-?start));
    ?}

    }



    輸出:
    memory used start: 132280
    memory used end: 189648
    總共消耗了內(nèi)存: 57368
    package?com;

    public?class?Test?
    {
    ?
    public?static?void?main(String[]?args)?
    ?
    {
    ??Runtime?rt?
    =?Runtime.getRuntime();
    ??
    long?start?=?rt.totalMemory()?-?rt.freeMemory();
    ??System.out.println(
    "memory?used?start:?"?+?start);??
    ??StringBuffer?sum?
    =?new?StringBuffer("");
    ??
    for?(int?i?=?0;?i?<?5000;?i++)
    ??
    {
    ???sum?
    =?sum.append("+").append(i);
    ??}

    ??
    long?end?=?rt.totalMemory()?-?rt.freeMemory();
    ??System.out.println(
    "memory?used?end:?"?+?end);
    ??System.out.println(
    "總共消耗了內(nèi)存:?"?+?(end?-?start));
    ?}

    }

    輸出:
    memory used start: 132192
    memory used end: 281056
    總共消耗了內(nèi)存: 148864


    ??? 書上說使用StringBuffer比Sting更能節(jié)省內(nèi)存,但從上面可以看出,好像StringBuffer消耗的內(nèi)存多,

    ???? 經(jīng)過測試,發(fā)現(xiàn)String比StringBuffer節(jié)省內(nèi)存,但StringBuffer運(yùn)行速度比String快。

    • ?? 不用new關(guān)鍵詞創(chuàng)建類的實

    ???? 對象的創(chuàng)建是個很昂貴的工作,所以我們應(yīng)當(dāng)盡量減少對象的創(chuàng)建,在需要的時候聲明它,初始化它,不要重復(fù)初始化一個對象,盡量能做到再使用,而用完后置null有利于垃圾收集。讓類實現(xiàn)Cloneable接口,同時采用工廠模式,將減少類的創(chuàng)建,每次都是通過clone()方法來獲得對象。另外使用接口也能減少類的創(chuàng)建。對于成員變量的初始化也應(yīng)盡量避免, 特別是在一個類派生另一個類時。

      ?異常拋出對性能不利。拋出異常首先要創(chuàng)建一個新的對象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為, fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,JVM就必須調(diào)整調(diào)用堆棧,因為在處理過程中創(chuàng)建了一個新的對象。 異常只能用于錯誤處理,不應(yīng)該用來控制程序流程。

      此外, 建議關(guān)閉Debug輸出,盡量少用串行化、同步操作和耗時昂貴的服務(wù)(如Date())。??????

    • ?????? 使用合適的類型

    ????? 當(dāng)原始類型不能滿足我們要求時,使用復(fù)雜類型。String和StringBuffer的區(qū)別自不必說了,是我們使用最多的類型,在涉及到字符運(yùn)算時,強(qiáng)烈建議使用StringBuffer。在做String匹配時使用intern()代替equal()。

      帶有final修飾符的類是不可派生的, 如果指定一個類為final,則該類所有的方法都是final。

      Java編譯器會尋找機(jī)會內(nèi)聯(lián)所有的final方法,這將能夠使性能平均提高50%。類的屬性和方式使用final或者static修飾符也是有好處的。

      ?調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。所以盡量使用局部變量。

      ?ArrayList和Vector,HashMap和Hashtable是我們經(jīng)常用到的類,前者不支持同步,后者支持同步,前者性能更好,大多數(shù)情況下選擇前者。

    posted on 2007-03-09 13:33 阿蜜果 閱讀(1047) 評論(3)  編輯  收藏 所屬分類: Java


    FeedBack:
    # re: java性能優(yōu)化
    2007-03-09 18:06 | BeanSoft
    呵呵, 不錯, Amigo 越來越厲害了.  回復(fù)  更多評論
      
    # re: java性能優(yōu)化
    2007-03-09 20:53 | 施偉
    這么有深度。。。看來大家要加油,向Amigo學(xué)習(xí)。。。  回復(fù)  更多評論
      
    # re: java性能優(yōu)化 [未登錄]
    2007-03-09 21:36 | 阿蜜果
    哈哈,可惜是轉(zhuǎn)載的,存儲了很久,覺得很好,放上來了,原文出處都不知道:(  回復(fù)  更多評論
      
    <2007年3月>
    25262728123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

          生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關(guān)注blog

    積分與排名

    • 積分 - 2294516
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲好看的理论片电影| 免费网站看v片在线香蕉| 久久九九免费高清视频| 美女扒开尿口给男人爽免费视频| 亚洲国产精品网站在线播放 | 亚洲国产欧美国产综合一区| 亚洲国产精品日韩在线| 亚洲一区二区三区在线观看蜜桃| 91亚洲国产成人久久精品| 亚洲人成在线中文字幕| 亚洲AV成人无码天堂| 亚洲综合丁香婷婷六月香| 亚洲国产日韩精品| 337p日本欧洲亚洲大胆人人| 男性gay黄免费网站| 一级毛片在线完整免费观看| 中国一级毛片视频免费看| 久久精品成人免费看| **毛片免费观看久久精品| 一级视频在线免费观看| 久久99久久成人免费播放| 两个人看的www免费| 99久久99久久免费精品小说| 国产精彩免费视频| 国内一级一级毛片a免费| 全黄a免费一级毛片人人爱| 久久久久无码专区亚洲av| 国产亚洲成AV人片在线观黄桃| 久久久国产精品亚洲一区| 亚洲一卡一卡二新区无人区| 国产精品亚洲а∨无码播放不卡 | 国产天堂亚洲国产碰碰| 亚洲视频在线免费| 色欲A∨无码蜜臀AV免费播| 欧美a级在线现免费观看| 亚洲AV无码之日韩精品| 亚洲第一AAAAA片| 国产成人亚洲精品| 深夜福利在线免费观看| 无码一区二区三区免费| 免费羞羞视频网站|