这不算原创吧,也不是转载,也不是翻译。算是阅读笔记吧。源于android的dev guide
http://developer.android.com/guide/practices/design/performance.html
开始
代码优化的基本原则:
- 只做应该做的
- 内存能不申请就不申请
具体做法:
对于数据结构和算法的优化所产生的效果要比遵循这些条条框框的要好
2. 避免申请内存
- 尽量不要在循环中新建对象,这样会迫使vm总在gc
- 用StringBuffer替代String做加运算。这样就不会产生大量的中间对象了。String可是无法修改的
- 截取String时,用subString()替代新建对象。因为用subString()时,内部的char[]是共享的
- 将一个类的数组切分成多个数组。也就是说一个类A含有{int a, int b},那么将其分成a[]和b[]的执行效率要比A[]的高。但是这么做不好维护吧~~
- JIT的优化会让接口引用和直接引用的效率相同
- JIT会让值缓存和不缓存的效率相同(就是在for中缓存len一类的东西)
5. 私有域不要用Getter和Setter进行访问
据说速度相差3x~7x
6. 常量用static final修饰
静态常量会被写入dex文件,在使用的时候直接被替换(类似与C中的宏吧);其他的域在调用的时候会去查类的域表,降低性能
7. 用foreach代替其他迭代方式
foreach在大部分情况下的执行效率是比较高的,而且还能避免指针越界等错误的发生。只有在用ArrayList的时候,手动迭代会比foreach快,3x多吧。
8. 内部类用package作用域替代private作用域
- 对于private的内部类,使用外部域时会新建桥接类,而package作用域的内部类就不会有这个问题
- 如果是对外公开接口的话,就最好将内部类写成private了
9. 关于浮点数
- float在计算的时候会比integer慢2x多
- float和double在计算的时候速度一样,只是double的空间占用是2x
库函数这个也就是遇到哪里用到哪里了。guide上说了两个函数:String.indexOf()和System.arraycopy()
11. 少用JNI
11. 少用JNI
JNI并不一定会比java代码的效率更高。guide上建议除移植之外尽量不用JNI。或者说不要因为提高效率而用JNI。
12. 优化后做性能对比
12. 优化后做性能对比
Guide上提的Caliper我怎么用不了呢?