java代码优化

一、避免在循环条件中使用复杂表达式 在遍历list集合常犯次错误

在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 

例子: 

import java.util.vector;
class cel {
    void method (vector vector) {
        for (int i = 0; i < vector.size (); i++)  // violation
            ; //vector.size () 重复计算 
} }


更正: 

class cel_fixed {
    void method (vector vector) {
        int size = vector.size ()
        for (int i = 0; i < size; i++)
            ; // ...
    }
}

 二、为实例化集合类定义初始大小(如果能确定集合大小的情况下),stringbuffer同理

      jvm为集合扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。可见集合容量的扩大是一个颇费时间的事。 
通常,默认的开辟的空间大小是不够的。你最好能较准确的估计你所需要的最佳大小,尽可能避免触发扩容操作 

以vector为例: 

public class dic {
    public void addobjects (object[] o) {
        // if length > 10, vector needs to expand
        for (int i = 0; i< o.length;i++) {    
            v.add(o);   // capacity before it can add more elements.
        }
    }
    public vector v = new vector();  // no initialcapacity.
}


更正: 
自己设定初始大小。 

    public vector v = new vector(20);  
    public hashtable hash = new hashtable(10);

三、不要在循环中调用synchronized(同步)方法
 


方法的同步需要消耗相当大的资源(独占),同理,在循环中尽可能不调用特耗费时间的函数,比如需要与数据库交互的函数等。 

例子: 
import java.util.vector;
public class syn {
    public synchronized void method (object o) {
    }
    private void test () {
        for (int i = 0; i < vector.size(); i++) {
            method (vector.elementat(i));    // violation
        }
    }
    private vector vector = new vector (5, 5);
}
更正: 
不要在循环体中调用同步方法,如果必须同步的话,推荐以下方式: 
import java.util.vector;
public class syn {
    public void method (object o) {
    }
private void test () {
    synchronized{//在一个同步块中执行非同步方法
            for (int i = 0; i < vector.size(); i++) {
                method (vector.elementat(i));   
            }
        }
    }
    private vector vector = new vector (5, 5);
}

 四、将try/catch块移出循环 (实践中较少见)

    把try/catch块放入循环体内,会极大的影响性能,如果编译jit被关闭或者你所使用的是一个不带jit的jvm,性能会将下降21%之多! 
         
例子:         

import java.io.fileinputstream;
public class try {
    void method (fileinputstream fis) {
        for (int i = 0; i < size; i++) {
            try {                                      // violation
                _sum += fis.read();
            } catch (exception e) {}
        }
    }
    private int _sum;
}
         
更正:         
将try/catch块移出循环         
  
 void method (fileinputstream fis) {
        try {
            for (int i = 0; i < size; i++) {
                _sum += fis.read();
            }
        } catch (exception e) {}
    }
五、不要在循环体中实例化变量 

在循环体中实例化临时变量将会增加内存消耗 

例子:         
import java.util.vector;
public class loop {
    void method (vector v) {
        for (int i=0;i < v.size();i++) {
            object o = new object();//在栈内存中会有多个引用对象o
            o = v.elementat(i);
        }
    }
}

         
更正:         
在循环体外定义变量,并反复使用         
import java.util.vector;
public class loop {
    void method (vector v) {
        object o;//如此设计,栈内存中只有一个引用对象o,节约空间
        for (int i=0;i<v.size();i++) {
            o = v.elementat(i);
        }
    }
}

 

posted @ 2015-11-03 14:05  zhouyp  阅读(120)  评论(0)    收藏  举报