자바 코드 최적화

11252 단어 자바
출처:http://thecodesample.com/
본 고 는 자바 의 성능 을 향상 시 키 는 몇 가지 기본 적 인 방법 을 제시 했다.
순환 조건 에서 계산 하지 마 세 요.
순환 (예 를 들 어 for 순환, while 순환) 조건 에서 계산 하면 한 번 순환 하면 한 번 계산 해 야 합 니 다. 이것 은 시스템 의 효율 을 낮 출 수 있 습 니 다. 예 를 들 어:
//         count *2
while(i < count *2) {
    //Do something ...
}
     :
//     
int total = count *2
while(i <total) {
    //Do something ...
}
  :
for (int i=0; i<size()*2; i++) {
    //Do something
}
    :
for (int i=0, stop=size()*2; i<stop; i++) {
    //Do something
}

 같은 하위 표현 식 을 여러 번 계산 하지 마 세 요.
if (birds.elementAt(i).isGrower()) ...
if (birds.elementAt(i).isPullet()) ...
               , :
Bird bird = birds.elementAt(i);
if (bird.isGrower()) ...
if (bird.isPullet()) ...

 
        ,               ,               。
double[] rowsum = new double[n];
for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        rowsum[i] += arr[i][j];
      :
double[] rowsum = new double[n];
for (int i = 0; i < n; i++) {
    double[] arri = arr[i];
    double sum = 0.0;
    for (int j = 0; j < m; j++)
        sum += arri[j];
    rowsum[i] = sum;
}

 가능 한 한 변수, 방법 을 final static 형식 으로 설명 합 니 다.
다음 예 는 주어진 연도 가 주어진 달 에 있 는 일 수 를 되 돌려 주 는 데 쓰 인 다.
public static int monthdays(int y, int m) {
    int[] monthlengths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    return m == 2 && leapyear(y) ? 29 : monthlengths[m-1];
}

 상기 방법 은 매번 호출 될 때마다 monthlengths 배열 을 다시 만 들 지만 중요 한 것 은 배열 이 바 뀌 지 않 고 변 하지 않 는 배열 에 속한다.이런 상황 에서
이 를 final static 로 설명 하 는 것 이 더 적합 합 니 다. 클래스 로 불 러 온 후에 이 배열 을 생 성 합 니 다. 매번 방법 을 호출 할 때마다 배열 대상 을 다시 만 들 지 않 습 니 다. 이것 은 시스템 성능 을 향상 시 키 는 데 도움 이 됩 니 다.
    :
private final static int[] monthlengths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public static int monthdays(int y, int m) {
    return m == 2 && leapyear(y) ? 29 : monthlengths[m-1];
}
                    static {… }  , :
private final static double[] logFac = new double[100];
static {
    double logRes = 0.0;
    for (int i=1, stop=logFac.length; i<stop; i++)
        logFac[i] = logRes += Math.log(i);
}
 
public static double logBinom(int n, int k) {
    return logFac[n] - logFac[n-k] - logFac[k];
}

 변수의 작용 범 위 를 축소 하 다
변 수 를 정의 할 수 있 는 방법 에 대한 정 의 는 방법 에 있 습 니 다. 순환 체 내 에 정의 할 수 있 는 것 은 순환 체 내 에 있 습 니 다. try.. catch 블록 에 배치 할 수 있 는 것 은 이 블록 안에 있 습 니 다.
GC 회수 에 박 차 를 가 하 는 것 이 목적 이다.
 
문자열 이 자주 "+" 동작 은 StringBuilder 나 StringBuffer 를 사용 합 니 다.
 
String 의 연결 작업 ("+") 은 이미 많은 최 적 화 를 했 지만 대량의 추가 작업 에서 StringBuilder 나 StringBuffer 는 "+" 보다 성능 이 훨씬 좋다.
String s = "";
for (int i=0; i<n; i++) {
    s += "#" + i;
}
    :
StringBuilder sbuf = new StringBuilder();
for (int i=0; i<n; i++) {
    sbuf.append("#").append(i);
}
String s = sbuf.toString();
  ,
String s = "(" + x + ", " + y + ")";
        StringBuilder.append(…)。

 exception 을 덮어 쓰 는 fillIn StackTrace 방법
fillIn StackTrace 방법 은 이상 한 스 택 정 보 를 기록 하 는 데 사 용 됩 니 다. 이것 은 시간 이 많이 걸 리 는 동작 입 니 다. 개발 할 때 스 택 정 보 를 주목 하지 않 아 도 된다 면 덮어 쓸 수 있 습 니 다.
fillInStackTrace 를 덮어 쓰 는 사용자 정의 이상 은 성능 을 10 배 이상 향상 시 킵 니 다.
class MyException extends Exception {
   public Throwable fillInStackTrace() {
      return this;
   }
}

 초기 화 지연
대상 이 필요 한 지 모 를 때 초기 화 지연 을 선택 할 수 있 습 니 다. 필요 할 때 초기 화 되 지만 한 번 만 할당 할 수 있 습 니 다.
public class Car {
    private Button button = new JButton();
    public Car() {
        ... initialize button ...
    }
    public final JButton getButton() {
        return button;
    }
}
    :
public class Car {
    private Button button = null;
 
    public Car() { ... }
    public final JButton getButton() {
        if (button == null) { // button not yet created, so create it
            button = new JButton();
            ... initialize button ...
        }
        return button;
    }
}

 대상 만 들 기 반복 하지 않 기
예 를 들 어 상품 관련 정보의 업 데 이 트 는 검색 을 위해 색인 을 만들어 야 한다.
단일 상품 에 대한 색인 은 다음 과 같 습 니 다.
public void index(Product product) {
    if (product != null) {
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
        fullTextEntityManager.index(product);
    }
}
          ,          ,   for  ,               。
public void indexAll(List<Product> products) {
    if (products != null) {
        for (Product product : products) {
            index(product);
        }
    }
}
        ,      Product       ,       FullTextEntityManager  。           ,    :
public void indexAll(List<Product> products) {
    if (products != null) {
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
        for (Product product : products) {
            fullTextEntityManager.index(product);
        }
    }
}
  Collections.emptyXXX        ArrayList,HashSet 

                           
public Set<Specification> getAllSpecifications(ProductCategory productCategory) {
    Set<Specification> specifications = new HashSet<Specification>();
    if (null != productCategory) {
        specifications.addAll(productCategory.getSpecifications());
        specifications.addAll(productCategory.getParentSpecifications());
    }
    return specifications;
}
    ,  productCategory    ,        Set  ,       Set        。               
,    ,   Collections emptySet()  ,             ,              。

 
    :
public Set<Specification> getAllSpecifications(ProductCategory productCategory) {
    if(productCategory == null){
        return Collections.<Specification>emptySet();
    }
    Set<Specification> specifications = new HashSet<Specification>();
    specifications.addAll(productCategory.getSpecifications());
    specifications.addAll(productCategory.getParentSpecifications());
    return specifications;
}
      

              ,         ,      Map     ,key   id,value     ,     
   Ajax          。        null,      。
public Map<Long, String> getSubCategoryTree(Long parentId) {
    Map<Long, String> categoryOptions = new HashMap<Long, String>();
    ProductCategory productCategory = productCategoryService.find(parentId);
    if (null == productCategory) {
        for (ProductCategory pc : productCategoryService.findRoots()) {
            categoryOptions.put(pc.getId(), pc.getName());
        }
    } else {
        for (ProductCategory pc : productCategory.getChildren()) {
            categoryOptions.put(pc.getId(), pc.getName());
        }
    }
    return categoryOptions;
}
      ,if-else           productCategoryService.findRoots()  productCategory.getChildren()   ,       。
               ,        if-else ,  for        。

  
public Map<Long, String> getSubCategoryTree(Long parentId) {
    Map<Long, String> categoryOptions = new HashMap<Long, String>();
    ProductCategory productCategory = productCategoryService.find(parentId);
    Collection<ProductCategory> productCategories = (productCategory == null) ? productCategoryService
            .findRoots() : productCategory.getChildren();
    for (ProductCategory pc : productCategories) {
        categoryOptions.put(pc.getId(), pc.getName());
    }
    return categoryOptions;
}

 
      else 
private int getAttributeValueId(String value) {
    if (StringUtils.isEmpty(value)) {
        return -1;
    } else {
        String[] values = value.split(ATTRIBUTE_ID_SEPARATOR);
        String id = values[values.length - 1];
        return Integer.parseInt(id);
    }
}
    
private int getAttributeValueId(String value) {
    if (StringUtils.isEmpty(value)) {
        return -1;
    }
    String[] values = value.split(ATTRIBUTE_ID_SEPARATOR);
    String id = values[values.length - 1];
    return Integer.parseInt(id);
 
}

 더 이상 사용 할 필요 가 없 을 때 연결 자원 을 닫 습 니 다.
다음은 데이터 베 이 스 를 간단하게 조회 하 는 코드 입 니 다. 조회 작업 을 마 친 후에 연결 자원 이 null 인지 여 부 를 판단 합 니 다. null 이 아니라면 해당 하 는 close () 방법 으로 자원 을 닫 습 니 다.
Statement stmt = null;
ResultSet rs = null;
Connection conn = getConnection();
try{
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sqlQuery);
    progressResult(rs);
}catch(SQLException e){
    //forward to handler
}finally {
    if(rs !=null){
        rs.close();
    }
    if(stmt != null){
        stmt.close();
    }
    if(conn !=null){
        conn.close();
    }
}
         ,     ,  rs   close()       , stmt conn     。

 자원 을 모두 방출 할 수 있 도록 다음 과 같이 바 꿔 야 한다.
Statement stmt = null;
ResultSet rs = null;
Connection conn = getConnection();
try{
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sqlQuery);
    progressResult(rs);
}catch(SQLException e){
    //forward to handler
}finally {
     
    try{
        if(rs !=null){
            rs.close();
        }
    }catch(SQLException e){
        //forward to handler
    }finally{
        try{
            if(stmt !=null){
                stmt.close();
            }
        }catch(SQLException e){
            //forward to handler
        }finally{
            try{
                if(conn !=null){
                    conn.close();
                }
            }catch(SQLException e){
                //forward to handler
            }
        }
    }
 
}
      JDK1.7    ,      Java SE 7      try-with-resource   。
try(   
	Connection conn = getConnection(); 
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sqlQuery)){
    progressResult(rs);
}catch(SQLException e){
    //forward to handler
}

좋은 웹페이지 즐겨찾기