小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

《Java最佳實(shí)踐》之用局部(堆)變量代替實(shí)例(類)變量- - - Rinso的專欄 - ...

 ShangShujie 2006-11-02
如果您頻繁存取變量,就需要考慮從何處存取這些變量。變量是 static 變量,還是堆棧變量,或者是類的實(shí)例變量?變量的存儲(chǔ)位置對(duì)存取它的代碼的性能有明顯的影響?例如,請(qǐng)考慮下面這段代碼:
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;
  }
 
  //存取類的實(shí)例變量
  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;
  }
}    
 
這段代碼中的每個(gè)方法都執(zhí)行相同的循環(huán),并反復(fù)相同的次數(shù)。唯一的不同是每個(gè)循環(huán)使一個(gè)不同類型的變量遞增。方法 stackAccess 使一個(gè)局部堆棧變量遞增,instanceAccess 使類的一個(gè)實(shí)例變量遞增,而 staticAccess 使類的一個(gè) static 變量遞增。
instanceAccess 和 staticAccess 的執(zhí)行時(shí)間基本相同。但是,stackAccess 要快兩到三倍。存取堆棧變量如此快是因?yàn)?,JVM 存取堆棧變量比它存取 static 變量或類的實(shí)例變量執(zhí)行的操作少。
JVM 是一種基于堆棧的虛擬機(jī),因此優(yōu)化了對(duì)堆棧數(shù)據(jù)的存取和處理。所有局部變量都存儲(chǔ)在一個(gè)局部變量表中,在 Java 操作數(shù)堆棧中進(jìn)行處理,并可被高效地存取。存取 static 變量和實(shí)例變量成本更高,因?yàn)?JVM 必須使用代價(jià)更高的操作碼,并從常數(shù)存儲(chǔ)池中存取它們。(常數(shù)存儲(chǔ)池保存一個(gè)類型所使用的所有類型、字段和方法的符號(hào)引用。)
通常,在第一次從常數(shù)存儲(chǔ)池中訪問 static 變量或?qū)嵗兞恳院?,JVM 將動(dòng)態(tài)更改字節(jié)碼以使用效率更高的操作碼。盡管有這種優(yōu)化,堆棧變量的存取仍然更快。
考慮到這些事實(shí),就可以重新構(gòu)建前面的代碼,以便通過存取堆棧變量而不是實(shí)例變量或 static 變量使操作更高效。請(qǐng)考慮修改后的代碼:
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 被修改為將它們的實(shí)例變量或 static 變量復(fù)制到局部堆棧變量中。當(dāng)變量的處理完成以后,其值又被復(fù)制回實(shí)例變量或 static 變量中。這種簡(jiǎn)單的更改明顯提高了 instanceAccess 和 staticAccess 的性能。這三個(gè)方法的執(zhí)行時(shí)間現(xiàn)在基本相同,instanceAccess 和 staticAccess 的執(zhí)行速度只比 stackAccess 的執(zhí)行速度慢大約 4%。
這并不表示您應(yīng)該避免使用 static 變量或?qū)嵗兞俊D鷳?yīng)該使用對(duì)您的設(shè)計(jì)有意義的存儲(chǔ)機(jī)制。例如,如果您在一個(gè)循環(huán)中存取 static 變量或?qū)嵗兞浚瑒t您可以臨時(shí)將它們存儲(chǔ)在一個(gè)局部堆棧變量中,這樣就可以明顯地提高代碼的性能。這將提供最高效的字節(jié)碼指令序列供 JVM 執(zhí)行。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多