【内存优化】避免使用Enum
来源:互联网 发布:阿里云学生机免费两年 编辑:程序博客网 时间:2024/04/29 03:31
图片来自:为什么Android中不建议使用Enums
在Android官网上已经明确指出应该在Android避免使用Enum,因为与静态常量相比,它对内存的占用要大很多。
下面有它们的一个比较:
假设我们有这样一份代码,编译之后的dex大小是2556 bytes,在此基础之上,添加一些如下代码,这些代码使用普通static常量相关作为判断值:
增加上面那段代码之后,编译成dex的大小是2680 bytes,相比起之前的2556 bytes只增加124 bytes。假如换做使用enum,情况如下:
使用enum之后的dex大小是4188 bytes,相比起2556增加了1632 bytes,增长量是使用static int的13倍。
参照:The price of ENUMs
具体原因是为什么呢?下面我们来对其进行分析分析。
下面定义了4个静态常量:
public static final int RED =0;public static final int GREEN =1;public static final int BLACK =2;public static final int YELLOW =3;
如果使用Enum表示如下:
public static enum Color { RED, GREEN, BLACK, YELLOW}
我们对Color类进行反编译,进入项目的bin目录,执行 javap -c Color.class
最终结果如下:
我们对上面的反编译代码进行整理如下:
public final class Color extends java.lang.Enum<Color> { public static final Color RED; public static final Color GREEN; public static final Color BLACK; public static final Color YELLOW; static { RED = new Color("RED", 0); GREEN = new Color("GREEN", 1); BLACK = new Color("BLACK", 2); YELLOW = new Color("YELLOW", 3); VALUES = new Color[]{RED, GREEN, BLACK, YELLOW}; } public static Color[] values() { Color tmp = new Color[VALUES.length]; system.arraycopy(VALUES, 0, tmp, 0, VALUES.length); return tmp; } public static Color valueOf(String name) { return Enum.valueOf(name); }}
上面的代码是根据上面反编译出来的代码编写的,不是标准的,操作过程基本可以呈现。
可以看到,本来是可以使用几个静态常量代替的Color类做了这么多额外的操作,分配了这么多内存,这也是Enum在Android不被建议使用的原因。
从上面的代码可以看到,它其实对上面的几个静态常量做了封装,然后又重新定义了几个静态封装对象,代价非常的大。
1 0
- 【内存优化】避免使用Enum
- 【Android性能优化】避免使用Enum
- 如何避免错误使用 Enum
- android 内存优化 避免内存溢出
- 尽量使用const、enum、inline,避免使用#define
- 转帖 尽量使用const、enum、inline,避免使用#define
- 尽量使用const、enum、inline,避免使用 #define
- Android 性能:避免在Android上使用ENUM
- J2me性能优化,避免内存溢出小结
- Bitmap优化,尽量避免内存溢出
- Android性能优化 - 避免内存泄露
- Android 内存优化,如何避免OOM
- Android 内存问题与优化避免
- 【Android程序优化,避免内存泄露】- [实战一]:避免内存泄露的最后一道墙,使用leakcanary分析程序中的内存泄露。
- 【Android程序优化,避免内存泄露】- [实战一]:避免内存泄露的最后一道墙,使用leakcanary分析程序中的内存泄露。
- 【代码优化】使用enum代替int常量
- Android内存优化(三)避免可控的内存泄漏
- 使用goto语句避免内存泄露
- 【索引】索引五种扫描方式至索引唯一扫描
- Gallery
- [db][mysql]mysql 性能分析及explain用法
- PHP echo, print, printf, sprintf函数的区别和使用
- LeetCode #58 Length of Last Word
- 【内存优化】避免使用Enum
- 关于UIautomator API及浅析
- Smali语法详解
- 使用VM 10安装虚拟机之一(windows xp)
- iOS 9 出现的问题
- 整体二分
- JSP内置对象及方法
- 加快XCode的编译链接速度(200%+)——XCode编译速度慢的解决方案
- 短信拦截广播