자바 코드 최적화-불필요 한 대상 만 들 기 피하 기

1852 단어 자바 잡기
《effective Java》책 에서 여섯 번 째 조 는 불필요 한 대상 을 만 들 지 말고 다시 한 번 총 결 하 라 고 쓰 여 있다.
다음 과 같은 몇 가 지 를 요약 한다.
 1.불필요 한 대상 을 만 드 는 것 을 피한다.예 를 들 어 문자열 의 생 성 은 new 방식 을 사용 하지 않 는 다.2.정적 공장 방법 을 통 해 불필요 한 대상 을 만 들 수 있다.3.대상 의 재 활용 은 일부 대상 이 재 활용 될 수 있다 면.
아래 의 예 를 보 세 요.
다음 정규 검사 데이터 형식 이 있 습 니 다.
static boolean isRomanNumeral(String s) {
    return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}

      이렇게 존재 하 는 문 제 는 임계 상황 에서 반복 적 으로 사용 하면 인 스 턴 스 를 만 들 고 한 번 만 사용 한 후에 쓰레기 를 회수 할 수 있다.성능 을 향상 시 키 기 위해 클래스 초기 화의 일부분 으로 정규 표현 식 에 표 시 된 Pattenrn 인 스 턴 스(가 변 적 이지 않 음)를 캐 시 하고 isRomanNumberal 방법의 모든 호출 에서 같은 인 스 턴 스 를 반복 합 니 다.
아래 방식 으로 바꾸다
public class Test06 {

  private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

    static boolean isRomanNumeral(String s) {
        return ROMAN.matcher(s).matches();
    }

}

이 최 적 화 를 보 았 을 때 나 는 면접 문 제 를 생각 하 게 되 었 다.
gc 회수 비율 이 8:1 보다 훨씬 큽 니 다.왜 요?
그때 제 대답 은 임시 대상 이 많다 는 거 예요.
면접 은 또 어떻게 최적화 하 느 냐 고 물 었 다.
저 는 대상 의 생 성 을 줄 이 고 대상 의 정의 범 위 를 제어 하 며 부분 변 수 는 부분 변수 로 정의 되 었 으 며 대상 의 생 성 범 위 를 임의로 정의 하지 않 았 던 것 으로 기억 합 니 다.
오늘 이 걸 보면 이 걸 보충 할 수 있 을 것 같 아 요.static 를 사용 하여 공용 대상 의 생 성 을 감소 합 니 다.
불필요 한 대상 을 만 드 는 것 을 피 하 는 또 다른 방법 은 자동 포장 이다.
private static long sum() {
    Long sum = 0L;
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    return sum;
}

      이 프로그램의 결 과 는 정확 하지만 한 문 자 를 잘못 썼 기 때문에 실행 결 과 는 실제 보다 훨씬 느리다.변수 sum 은 log 가 아 닌 Long 으로 밝 혀 졌 습 니 다.이 는 프로그램 이 약 231 개의 불필요 한 Long 인 스 턴 스(Long 유형의 sum 변수 에 log 형식의 구조 인 스 턴 스 를 추가 할 때마다)*요약:포장 의 기본 유형 이 아니 라 기본 유형 을 우선 사용 하고 무의식 적 인 자동 포장 도 주의해 야 합 니 다.

좋은 웹페이지 즐겨찾기