1. 程式人生 > >Android效能優化—不建議使用列舉Enum

Android效能優化—不建議使用列舉Enum

最近優化App,由於專案中使用了Lib,而Lib程式碼中包含了大量的列舉型別,導致App佔用記憶體過多。好吧,知道問題點,那就幹掉,拋棄之~

問題是解決了,為啥會這樣呢? 先來看看Android官網的說明吧:

看見了吧,Android官網不建議咱們使用enums,說的也很清楚了,佔用記憶體多(Enums often require more than twice as much memory as static constants.)。

Android中當你的App啟動後系統會給App單獨分配一塊記憶體。App的DEX code、Heap以及執行時的記憶體分配都會在這塊記憶體中。

舉個栗子:


1.使用Int表示狀態

public static final int VALUE1 =1;
public static final int VALUE1 =2;
public static final int VALUE1 =3;
2.使用Enums表示狀態

public static enum Value{
  VALUE1,
  VALUE2,
  VALUE3
}
情形2中的DEX size增加是情形1中的13倍之多。這還只是DEX code的增加,同樣,執行時的記憶體分配,一個enum值的宣告會消耗至少20 bytes,這還不算其中的物件陣列需要保持對enum值的引用。Why?使用javap反編譯情形二中生成的class檔案,去掉彙編程式碼後如下:

public final class VALUE extends java.lang.Enum{  
  public static final VALUE VALUE1;  
  public static final VALUE VALUE2;  
  public static final VALUE VALUE3;
  private static final VALUE[] values[];
  static{}
}
可以看到實際上enum型別繼承java.lang.Enum,每個列舉項都會被宣告成一個靜態變數,並被賦值。VALUE value1 = VALUE.VALUE1則會引起對靜態變數的引用。

因 此,當你的程式碼或包含的Lib中大量使用enums時,對於本身記憶體小的手機將是災難性的。不可否認enums會使得程式碼更易讀更安全,但是我們使用 Int也可以通過@IntDef 註解防止編譯時Lint errors。當然如果你使用enums,proguard在一些情況下會優化你的程式碼使用Int代替。
--------------------- 
作者:Colin-Dong 
來源:CSDN 
原文:

最近優化App,由於專案中使用了Lib,而Lib程式碼中包含了大量的列舉型別,導致App佔用記憶體過多。好吧,知道問題點,那就幹掉,拋棄之~

問題是解決了,為啥會這樣呢? 先來看看Android官網的說明吧:

看見了吧,Android官網不建議咱們使用enums,說的也很清楚了,佔用記憶體多(Enums often require more than twice as much memory as static constants.)。

Android中當你的App啟動後系統會給App單獨分配一塊記憶體。App的DEX code、Heap以及執行時的記憶體分配都會在這塊記憶體中。

舉個栗子:


1.使用Int表示狀態

public static final int VALUE1 =1;
public static final int VALUE1 =2;
public static final int VALUE1 =3;
2.使用Enums表示狀態

public static enum Value{
  VALUE1,
  VALUE2,
  VALUE3
}
情形2中的DEX size增加是情形1中的13倍之多。這還只是DEX code的增加,同樣,執行時的記憶體分配,一個enum值的宣告會消耗至少20 bytes,這還不算其中的物件陣列需要保持對enum值的引用。Why?使用javap反編譯情形二中生成的class檔案,去掉彙編程式碼後如下:

public final class VALUE extends java.lang.Enum{  
  public static final VALUE VALUE1;  
  public static final VALUE VALUE2;  
  public static final VALUE VALUE3;
  private static final VALUE[] values[];
  static{}
}
可以看到實際上enum型別繼承java.lang.Enum,每個列舉項都會被宣告成一個靜態變數,並被賦值。VALUE value1 = VALUE.VALUE1則會引起對靜態變數的引用。

因 此,當你的程式碼或包含的Lib中大量使用enums時,對於本身記憶體小的手機將是災難性的。不可否認enums會使得程式碼更易讀更安全,但是我們使用 Int也可以通過@IntDef 註解防止編譯時Lint errors。當然如果你使用enums,proguard在一些情況下會優化你的程式碼使用Int代替。
--------------------- 
作者:Colin-Dong 
來源:CSDN 
原文:

最近優化App,由於專案中使用了Lib,而Lib程式碼中包含了大量的列舉型別,導致App佔用記憶體過多。好吧,知道問題點,那就幹掉,拋棄之~

問題是解決了,為啥會這樣呢? 先來看看Android官網的說明吧:

看見了吧,Android官網不建議咱們使用enums,說的也很清楚了,佔用記憶體多(Enums often require more than twice as much memory as static constants.)。

Android中當你的App啟動後系統會給App單獨分配一塊記憶體。App的DEX code、Heap以及執行時的記憶體分配都會在這塊記憶體中。

舉個栗子:


1.使用Int表示狀態

public static final int VALUE1 =1;
public static final int VALUE1 =2;
public static final int VALUE1 =3;
2.使用Enums表示狀態

public static enum Value{
  VALUE1,
  VALUE2,
  VALUE3
}
情形2中的DEX size增加是情形1中的13倍之多。這還只是DEX code的增加,同樣,執行時的記憶體分配,一個enum值的宣告會消耗至少20 bytes,這還不算其中的物件陣列需要保持對enum值的引用。Why?使用javap反編譯情形二中生成的class檔案,去掉彙編程式碼後如下:

public final class VALUE extends java.lang.Enum{  
  public static final VALUE VALUE1;  
  public static final VALUE VALUE2;  
  public static final VALUE VALUE3;
  private static final VALUE[] values[];
  static{}
}
可以看到實際上enum型別繼承java.lang.Enum,每個列舉項都會被宣告成一個靜態變數,並被賦值。VALUE value1 = VALUE.VALUE1則會引起對靜態變數的引用。

因 此,當你的程式碼或包含的Lib中大量使用enums時,對於本身記憶體小的手機將是災難性的。不可否認enums會使得程式碼更易讀更安全,但是我們使用 Int也可以通過@IntDef 註解防止編譯時Lint errors。當然如果你使用enums,proguard在一些情況下會優化你的程式碼使用Int代替。
--------------------- 
作者:Colin-Dong 
來源:CSDN 
原文:https://blog.csdn.net/lingruimingfeng/article/details/51538472 
版權宣告:本文為博主原創文章,轉載請附上博文連結!


版權宣告:本文為博主原創文章,轉載請附上博文連結!


版權宣告:本文為博主原創文章,轉載請附上博文連結!