자바 성능 최적화 유 니 버 설 편
3027 단어 기술 탐구
통용 편
'유 니 버 설 편' 토론 의 문 제 는 대부분의 자바 응용 에 적합 하 다.
1.1 new 키워드 로 클래스 를 만 들 지 않 는 인 스 턴 스
new 키워드 로 클래스 의 인 스 턴 스 를 만 들 때 구조 함수 체인 의 모든 구조 함수 가 자동 으로 호출 됩 니 다.그러나 한 대상 이 Cloneable 인 터 페 이 스 를 실현 한다 면 우 리 는 그것 의 clone () 방법 을 호출 할 수 있다.clone () 방법 은 어떠한 구조 함수 도 호출 하지 않 습 니 다.
디자인 모드 (Design Pattern) 를 사용 하 는 경우 Factory 모드 로 대상 을 만 들 면 clone () 방법 으로 새로운 대상 인 스 턴 스 를 만 드 는 것 은 매우 간단 합 니 다.예 를 들 어 다음은 Factory 모델 의 전형 적 인 실현 이다.
public static Credit getNewCredit() {return new Credit();}
개 선 된 코드 는 clone () 방법 을 사용 합 니 다. 다음 과 같 습 니 다.
private static Credit BaseCredit = new Credit();public static Credit getNewCredit() {return (Credit) BaseCredit.clone();}
위의 사 고 는 배열 처리 에 도 매우 유용 하 다.
1.2 비 차단 I / O 사용
버 전이 낮은 JDK 는 비 차단 I / O API 를 지원 하지 않 습 니 다.I / O 차단 을 피하 기 위해 일부 응용 프로그램 은 대량의 라인 을 만 드 는 방법 을 사용 했다. (비교적 좋 은 상황 에서 버퍼 를 사용 할 것 이다.)이런 기술 은 웹 서버, 견적, 경매 응용 등 병발 I / O 흐름 을 지원 해 야 하 는 많은 응용 에서 볼 수 있다.그러나 자바 스 레 드 를 만 드 는 데 는 상당 한 비용 이 필요 하 다.
JDK 1.4 는 차단 되 지 않 은 I / O 라 이브 러 리 (java. nio) 를 도입 했다.만약 응용 프로그램 이 버 전의 빠 른 JDK 를 사용 하도록 요구한다 면, 여기에 비 차단 I / O 를 지원 하 는 패키지 가 있 습 니 다.
1.3 이상 사용
이상 은 성능 에 불리 하 다.이상 을 던 지면 먼저 새로운 대상 을 만들어 야 합 니 다.Throwable 인터페이스의 구조 함수 호출 은 fillInStackTrace () 라 는 로 컬 (Native) 방법, fillInStackTrace () 방법 으로 스 택 을 검사 하고 호출 추적 정 보 를 수집 합 니 다.이상 이 있 으 면 VM 은 호출 스 택 을 조정 해 야 합 니 다. 처리 과정 에서 새로운 대상 을 만 들 었 기 때 문 입 니 다.
이상 은 오류 처리 에 만 사용 할 수 있 을 뿐 프로그램 절 차 를 제어 하 는 데 사용 해 서 는 안 된다.
1.4 초기 화 변 수 를 반복 하지 않 음
기본 적 인 상황 에서 클래스 의 구조 함 수 를 호출 할 때 자바 는 변 수 를 정확 한 값 으로 초기 화 합 니 다. 모든 대상 은 null 로 설정 되 고 정수 변수 (byte, short, int, long) 는 0 으로 설정 되 며 float 와 double 변 수 는 0. 0 으로 설정 되 며 논리 값 은 false 로 설정 합 니 다.하나의 클래스 가 다른 클래스 에서 파생 될 때 이 점 은 특히 주의해 야 한다. new 키워드 로 대상 을 만 들 때 구조 함수 체인 의 모든 구조 함수 가 자동 으로 호출 되 기 때문이다.
1.5 가능 한 클래스 를 지정 하 는 final 수정자
final 수정자 가 있 는 종 류 는 파생 할 수 없다.자바 핵심 API 에는 자바. lang. string 과 같은 final 을 사용 하 는 예 가 많 습 니 다.String 클래스 에 final 을 지정 하여 사람들 이 length () 를 덮어 쓰 는 것 을 방지 합 니 다.
또 하나의 종 류 를 final 로 지정 하면 모든 방법 이 final 이다.자바 컴 파일 러 는 인 라인 (inline) 의 모든 final 방법 을 찾 을 수 있 습 니 다.이 는 성능 을 평균 50% 높 일 수 있다.
1.6 부분 변 수 를 최대한 사용
호출 방법 을 사용 할 때 전달 하 는 매개 변수 와 호출 에서 만 든 임시 변 수 는 스 택 (Stack) 에 저장 되 어 속도 가 빠 릅 니 다.정적 변수, 인 스 턴 스 변수 등 다른 변 수 는 모두 더미 (Heap) 에서 만 들 고 속도 가 느 립 니 다.또한 구체 적 인 컴 파일 러 / JVM 에 의존 하면 국부 변 수 는 더욱 최 적 화 될 수 있다.
1.7 곱셈 과 나눗셈
다음 코드 를 고려 하 십시오:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
곱셈 대신 이 위 조작 을 하면 성능 을 크게 향상 시 킬 수 있다.다음은 수 정 된 코드 입 니 다.
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
수 정 된 코드 는 8 을 곱 하 는 작업 을 하지 않 고 등가 의 왼쪽 이동 3 비트 로 바 꾸 며 왼쪽 이동 1 비트 당 2 를 곱 하 는 것 과 같다.이에 따라 오른쪽으로 한 자 리 를 옮 기 는 것 은 2 로 나 누 는 것 과 같다.특히 자리 옮 기 는 작업 속도 가 빠 르 지만 코드 를 이해 하기 어 려 울 수 있 으 므 로 주석 을 붙 이 는 것 이 좋다.