在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。
一、避免在循环条件中使用复杂表达式
在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。还有一个原则,决不在一个For语句中第二次调用一个类的方法
例子:
class cel {
void method (vector vector) {
for (int i = 0; i < vector.size (); i++) // violation
; // ...
}
优化:
void method (vector vector) {
int size = vector.size ();
for (int i = 0; i < size; i++)
; // ...
}
或者
void method (vector vector) {
for (int i = 0,size = vector.size ();i < size; i++)
; // ...
}
二、让访问实例内变量的getter/setter方法变成”final”
例子:
public void setsize (int size) {
_size = size;
}
优化:
final public void setsize (int size) {
_size = size;
}
三、在字符串相加的时候,使用 ' ' 代替 " ",如果该字符串只有一个字符的话
例子:
public void method(string s) {
string string = s + "d" // violation.
string = "abc" + "d" // violation.
}
优化:
public void method(string s) {
string string = s + 'd'
string = "abc" + 'd'
}
四、将try/catch块移出循环
把try/catch块放入循环体内,会极大的影响性能,如果编译jit被关闭或者你所使用的是一个不带jit的jvm,性能会将下降21%之多
例子:
void method (fileinputstream fis) {
for (int i = 0; i < size; i++) {
try { // violation
_sum += fis.read();
} catch (exception e) {}
}
}
优化;
void method (fileinputstream fis) {
try {
for (int i = 0; i < size; i++) {
_sum += fis.read();
}
} catch (exception e) {}
}
五、对于boolean值,避免不必要的等式判断
将一个boolean值与一个true比较是一个恒等操作(直接返回该boolean变量的值). 移走对于boolean的不必要操作至少会带来2个好处:
1)代码执行的更快 (生成的字节码少了5个字节);
2)代码也会更加干净
例子:
boolean method (string string) {
return string.endswith ("a") == true; // violation
}
优化:
boolean method (string string) {
return string.endswith ("a");
}
六、使用条件操作符替代"if (cond) return; else return;" 结构
例子:
public int method(boolean isdone) {
if (isdone) {
return 0;
} else {
return 10;
}
}
优化:
public int method(boolean isdone) {
return (isdone ? 0 : 10);
}
七、使用条件操作符代替"if (cond) a = b; else a = c;" 结构
例子:
void method(boolean istrue) {
if (istrue) {
value = 0;
} else {
value = 1;
}
}
优化:
void method(boolean istrue) {
_value = (istrue ? 0 : 1); // compact expression.
}
八、不要在循环体中实例化变量
在循环体中实例化临时变量将会增加内存消耗
例子:
void method (vector v) {
int size = v.size();
for (int i=0;i < size;i++) {
object o = new object();
o = v.elementat(i);
}
}
优化:
在循环体外定义变量,并反复使用
void method (vector v) {
int size = v.size();
object o;
for (int i=0;i<size;i++) {
o = v.elementat(i);
}
}
九、尽量使用final修饰符
带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如 java.lang.String。
为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高 50%。
十、尽量重用对象
特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。
十一、尽量使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量(static),实例变量等,都在堆(Heap)中创建,速度较慢。尤其是static,尽量少用,如果程序中存在大量static,说明程序的设计有问题.(很可能会占用大量内存)
十二、不要重复初始化变量
默认情况下,调用类的构造函数时,java会把变量初始化成确定的值,所有的对象被设置成null,整数变量设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键字创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
例如:
class test{
private Object obj; //不需要写成 private Object obj=null;
}
初始化就是赋值,赋值就是初始化
这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,public int state = this.getState();
十三、保证对象能够被及时回收
过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。 JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。
十四、采用在需要的时候才开始创建的策略
例如:
String str="abc";
if(i==1){
list.add(str);
}
优化:
if(i==1){
String str="abc";
list.add(str);
}
十五、不要将数组声明为:public static final
十六、array(数组)和ArrayList的使用
array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。
十七、应尽可能避免使用内在的GET,SET方法
像C++一样的编程语言,通常会使用Get方法(例如 i = getCount())去取代直接访问这个属性(i=mCount)。这在C++编程里面是一个很好的习惯,因为编译器会把访问方式设置为Inline,并且如果想约束或调试属性访问,你只需要在任何时候添加一些代码。在Android编程中,这不是一个很不好的主意。虚方法的调用会产生很多代价,比实例属性查询的代价还要多。我们应该在外部调用时使用Get和Set函数,但是在内部调用时,我们应该直接调用。
十八、尽量使用基本数据类型代替对象
十九、单线程应尽量使用 HashMap, ArrayList,除非必要,否则不推荐使用HashTable,Vector,她们使用了同步机制,而降低了性能
二十、未完待续.
分享到:
相关推荐
eclipse 开发 性能 优化 java 代码 性能 优化 特别从事android开发方面eclipse会很卡,这里提供比较全面的优化技巧,方便提高开发速度。
Android应用程序性能优化秘籍,有了它 再也不用和PM QA 撕逼啦。
面试Android性能优化
java Android小程序页面生成器java Android小程序页面生成器java Android小程序页面生成器java Android小程序页面生成器java Android小程序页面生成器java Android小程序页面生成器java Android小程序页面生成器java...
Android应用程序的性能优化分析与研究.pdf
android开发技巧与性能优化。详细交接了android开发中与普通java开发的区别和技巧。
android应用性能优化最佳实践android应用性能优化最佳实践
Java性能优化的45个细节 1.尽量在合适的场合使用单例 2.尽量避免随意使用静态变量 ...
Android应用性能优化 开发优秀的Android应用必备指南
Android应用性能优化
从内存和CPU两个角度去优化应用程序和分析内存泄漏原因
内容简介:, 今天的Android应用开发者经常要想尽办法来提升程序性能。由于应用越来越复杂,这个问题也变得越来越棘手。本书主要介绍如何快速高效地优化应用,让应用变得稳定高效。你将学会利用Android SDK和NDK来...
本期简介 《GOOGLE ANDROID 开发入门与实战》简介 1. 最常用的 ECLIPSE ECLIPSE ...7. 用 ANDROID 运行最简单的C 程序 8. 开发技巧杂集 8.1 一些源于 CSS 的组合实现技巧 8.2 关于 SEARCH 搜索框的使用 . . . ......
在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(GarbageCollection,GC)完成的,程序员不需要通过调用函数来释放内存,但也随之带来了内存泄漏的可能,上篇博客,我介绍了Android性能优化系列之...
史上最全的android和java面试文档集。包括有: java程序员面试宝典.txt Java面试宝典2011版-1C,Java基础部分.doc 三大框架面试题.zip 技术面试题.zip Android笔试题库 C语言终极面试宝典.doc Java笔试题目汇总.pdf ...