자바 성능 튜닝 11 실용적인 팁

필요한 전에 1. 할 수있는 최적화

이것은 아마도 가장 중요한 성능 튜닝 기술 중 하나입니다. 당신은 일반적인 모범 사례를 따라 효과적으로 사용 사례를 구현하는 시도해야합니다. 하지만이 필요하기 전에 증거를 의미하지 않는다, 표준 라이브러리를 교체하거나 복잡한 최적화를 구축 할 수 있습니다.

대부분의 경우, 조기 최적화 읽고 유지하는 코드가 어려워 시간이 많이 걸립니다. 응용 프로그램의 중요하지 않은 부분을 최적화 많은 시간을 보내고 있기 때문에 더 나쁜, 이러한 최적화는 일반적으로, 어떤 좋은 가져 오지 않습니다.

그렇다면 당신은 당신이 어떤 일을 최적화 할 필요가 있음을 증명합니까?

첫째, 응용 프로그램 코드의 속도를 결정해야합니다, 예를 들어, 지정된 최대 응답 시간에 대한 모든 API 호출, 또는 특정 기간에 지정된 수의 레코드. 완료되면, 당신은 응용 프로그램의 어떤 부분이 너무 느립니다 개선에 필요한 사항을 측정 할 수 있습니다. 이렇게되면 두 번째 튜닝 팁을 참조하십시오.

2. 실제 병목 현상을 찾기 위해 프로파일 러를 사용하여

후 첫 번째 제안을 따라하고 응용 프로그램의 특정 부분 개선이 필요합니까 식별, 어디서부터 시작하는 자신에게 물어?

이 문제를 해결하기 위해 두 가지 방법을 사용할 수 있습니다 :

당신은 의심스러운 모습부터, 당신의 코드를 볼 수 있습니다 또는 당신은 문제가있는 부분이 될 것 같아요.

또는 분석기, 행동 및 코드 인수의 각 부분의 성능 정보를 사용하여.

당신은 항상 두 번째 방법을 따라야하는 이유에 관해서.

대답은 분석의 방법은 당신이 더 코드의 성능에 미치는 영향을 이해 할 수 있습니다, 당신은 가장 중요한 부분에 초점을 맞출 수에 따라 명백해야한다. 혹시 분석기를 사용한 적이 있다면, 당신은 깜짝 놀라게 할 것이다 어떤 성능 문제를 일으키는 코드의 일부. 그러나, 여러 번, 첫 번째 추측은 잘못된 방향으로 당신을 이끌 것입니다.

 

3. 전체 응용 프로그램에 대한 성능 테스트 스위트를 생성

이것은 당신이 많은 예기치 않은 문제를 방지하는 또 다른 일반적인 팁입니다, 이러한 문제는 일반적으로 성능을 개선하기 위해 프로덕션 환경에 배포 후 발생합니다. 당신은 항상 성능 테스트 스위트의 정의의 전체 응용 프로그램을 테스트하고 전과를 완료 성능 개선 후를 실행해야합니다.

이러한 추가 테스트 실행하면 변경 기능과 성능에 영향을 식별하는 데 도움이, 그리고 당신은 좋은보다 업데이트 좀 더 해를 공개하지 않도록 할 것입니다. 당신의 작업은 특히 중요 데이터베이스 또는 캐시와 같은 응용 프로그램의 여러 부분에서 실행하는 경우.

4. 우선 가장 큰 병목 현상을 해결

응용 프로그램의 분석을 위해 분석기를 사용하여 테스트 스위트를 생성 한 후, 질문 성능을 개선 할 필요가 당신은 괜찮아요, 목록을해야합니다,하지만 여전히 시작 위치를해야한다 질문에 대답하지 않습니다. 또한 시작하거나 신속하게 가장 중요한 문제에서 얻을 수있는 사람들에서 시작할 수 있습니다.

곧 결과가 될 것이기 때문에 물론, 전은 매우 매력적이다. 때때로, 당신은 다른 팀 구성원 또는 관리를 설득해야 할 수도 있습니다, 성능 분석은 가치가있다.

그러나 일반적으로, 나는 무엇보다도 가장 중요한 성능 문제를 해결 건의 할 것입니다. 이 가장 큰 성능 향상을 제공합니다, 당신은 단지 당신의 성능 요구 사항을 해결할 수있는 이러한 문제를 해결하기 위해해야 ​​할 수도 있습니다.

일반적인 성능 튜닝 팁의 이해에서의 자바의 몇 가지 구체적인 튜닝 팁에 대해 자세히 살펴 보겠습니다.

5. 모두 StringBuilder 문자열 프로그램에 연결

자바에서 연결 문자열에 대한 여러 가지 옵션이 있습니다. 예를 들어, 간단한 + 나 + =, 또는 오래된 StringBuffer를 모두 StringBuilder.

어떤 방법을 그래서 당신이 선택해야합니까?

대답은 코드의 연결 문자열에 따라 달라집니다. 당신이 for 루프, 예를 들어, 프로그래밍 문자열에 새로운 내용을 추가하는 경우, 당신은 모두 StringBuilder를 사용해야합니다. 그것은 StringBuffer를보다 사용하고 더 나은 성능을 제공하는 것이 더 쉽습니다. 하지만 스레드로부터 안전하지 않습니다, StringBuffer를 서로 다른 StringBuilder에, 기억하고 모든 사용 사례에 적합하지 않을 수 있습니다.

당신은 새로운 StringBuilder의 인스턴스를해야하고, 문자열에 새 섹션을 추가 Append 메서드를 호출합니다. 모든 부품을 추가 할 때, 당신은 연결 문자열을 검색하는 toString () 메서드를 호출 할 수 있습니다.

다음의 코드는 간단한 예를 나타낸다. 각 반복에서,주기 나는 문자열로 변환되고, 그래서 결국,이 코드는 로그 파일에 "이 test0123456789은"기록, 공간의 StringBuilder sb의에 추가합니다.

모두 StringBuilder SB = 새의 StringBuilder ( "이것은 테스트입니다"); 
경우 (나는 <10, I = 0 int로 난 ++) {
sb.append (Ⅰ);
sb.append ( "");
}
log.info (sb.toString ());

코드 세그먼트에서 볼 수 있듯이, 당신은 생성자 메서드에 대한 문자열의 첫 번째 요소를 제공 할 수 있습니다. 이 용량 및 제공 16 여분의 문자열을 포함하는 새의 StringBuilder를 생성합니다. 당신은 모두 StringBuilder에 더 많은 문자를 추가 할 때, JVM 동적으로하여 StringBuilder의 크기를 변경합니다.

 

이미 문자열이 문자의 수를 포함 알고 있다면, 당신은 StringBuilder에 정의 된 용량이 인스턴스화하는 다른 기능의 방법이 번호를 제공 할 수 있습니다. 이 동적으로 용량을 확장 할 필요가 없기 때문에 이것은 또한, 효율성을 향상시킨다.

연결 문자열 선언 6 +

자바의 첫 번째 응용 프로그램을 달성 할 때, 당신은 당신이 +로 문자열을 연결할 필요가 없습니다 말했다되었을 수 있습니다. 올바른 애플리케이션 로직의 연결 문자열합니다. 문자열이 결과는 새로운 스트링 객체에 연결된 각 스트링에 저장되고, 불변이다. 이 루프에서 다수의 스트링에 접속 특히, 추가 메모리가 필요하며, 어플리케이션의 속도를 감소시킨다.

이 경우, 당신은 팁 (5)를 따라 모두 StringBuilder를 사용해야합니다.

당신은 코드의 가독성을 높이기 위해 여러 줄에 불과 문자열이라면, 그것은 사실이 아니다.

질의 q = em.createQuery ( "a.id SELECT, a.firstName, a.lastName" 
+ "저자는"
+ "WHERE a.id = 아이디");

이러한 경우에, 당신은 당신의 문자열을 연결하는 간단한 +해야한다. 자바 컴파일러는 컴파일시에를 최적화하고 연결을 실행합니다. 따라서, 실행시에, 단 하나의 문자 코드를 사용, 당신은 연결 할 필요는 없다.

기본 데이터 유형과 같은 7.

또 다른 방법은 오히려 자신의 포장보다 기본 데이터 형을 사용하는 응용 프로그램의 프로그램 성능을 향상시킬 수있는 비용, 빠른 방법을 방지 할 수 있습니다. 그래서 INT 정수 대신 사용하거나 대신 더블의 두 배로하는 것이 좋습니다. 이것은 JVM 메모리 소비를 줄이고, 그것으로보다 효율적으로 처리하기 위해 스택에 저장된 값 것입니다 수 있습니다.

8. 인 BigInteger와 BigDecimal를 피하기

우리는 데이터 유형을 설명한 것처럼, 우리는 BigInteger를하고 BigDecimal를 살펴 보겠습니다. 높은 인기 정확도로 인해, 특히 후자. 하지만이 가격에 온다.

BigDecimal를 BigInteger를하고 간단한 긴 또는 두 배 이상 더 많은 메모리를 필요로하며, 크게 모두의 계산 속도를 줄일 수 있습니다. 당신이 여분의 정밀도를 필요로하거나 그림은 긴의 범위를 초과하는 경우에 따라서, 더 나은 두 번 생각합니다. 이것은 아마도 당신은 특히 당신이 수학적 알고리즘을 구현하는 경우, 문제의 성능을 개선하기 위해 변경할 필요가있는 유일한 장소입니다.

9. 첫째, 현재의 로그 레벨을 확인

이 조언은 분명하지만, 불행히도, 당신은 그것을 무시하는 코드를 많이 찾을 수 있습니다. 당신이 디버그 메시지를 작성하기 전에, 당신은 현재 로그 수준을 확인해야합니다.

여기 당신이 그것을하지 말아야 할 것을 보여주기 위해 두 가지 예입니다.

//이하지 않는다 
log.debug ( "사용자 ["+는 userName + "]와 방법 X라고 불리는 ["+ 난 + "]");
//하거나
log.debug (및 String.format ( "방법으로 X [%의 D]라는 사용자 [%의 S] ', 이름, I));

두 경우 모두 로깅 프레임 워크 로그 메시지를 사용할지 여부를 모르고, 로그 메시지를 작성하는 데 필요한 모든 단계를 수행합니다. 당신이 디버그 메시지를 작성하기 전에, 현재의 로그 수준을 확인하는 것이 좋습니다.

// 이렇게 
경우 (log.isDebugEnabled ()) {
log.debug ( "사용자 ["+는 userName + "]으로 불리는 방법 X ["+ I + "]");
}

(10) 대신 아파치 코 몬즈 StringUtils.Replace하려면 string.replace를 사용하는

일반적으로하려면 string.replace 방법을 사용하면 자바 (9)를 사용하는 경우 특히 잘 작동하고 매우 효율적입니다. 그러나 응용 프로그램 교체 작업을 많이 필요로하고, 자바의 최신 버전으로 업데이트하지 않은 경우, 빠른 확인하고 더 효과적인 대안은 여전히 ​​의미가있다.

 

그것은 후보 아파치 코 몬즈 랭의 StringUtils.replace (https://commons.apache.org/proper/commons-lang/) 방법이다. 루카스 에더는 그의 최근 블로그 포스트 (https://blog.jooq.org/2017/10/11/benchmarking-jdk-string-replace-vs-apache-commons-stringutils-replace/)에 설명 된대로 그것은 크게 자바하려면 string.replace 방법 (8)을 초과한다.

그것은 단지 작은 변화를 필요로한다. 당신은 응용 프로그램의 pom.xml에 메이븐 종속성을 추가하고, 모든하려면 string.replace 방법 StringUtils.replace 메소드 호출을 대체하기 위해 아파치 커먼즈 랭 프로젝트에 필요합니다.

//이 교체 
test.replace ( "테스트", "간단한 테스트를");
// 이에
StringUtils.replace (테스트, "테스트", "간단한 테스트");

같은 데이터베이스 연결로 (11) 캐시 비싼 자원,

캐싱은 반복적으로 수행 비싸거나 자주 사용하는 코드 조각을 피하기 위해 인기있는 솔루션입니다. 일반적인 아이디어는 간단하다 : 새 자원을 작성 다시 다시 반복보다 이러한 자원의 사용이 훨씬 저렴합니다.

전형적인 예는 캐시 데이터베이스 연결 풀이다. 기존 연결을 재사용하는 것은 피할 수 있습니다 경우 새 연결, 시간이 소요 만듭니다.

또한 자바 언어 자체에서 다른 예를 찾을 수 있습니다. 예를 들면, -128에서 127 사이의 정수 값에 대한 캐시 valueOf 메소드. 새 정수가 너무 비용이 만들 말할 수도 있지만, 종종 가장 일반적으로 사용되는 값은 성능 이점을 제공하는 캐싱 사용된다.

당신이 기억, 캐싱을 고려할 때, 캐시 구현은 오버 헤드를 생성합니다. 당신은 사용되지 않는 자원을 액세스 할 수있는 자원을 활성화하거나 삭제 캐시를 관리해야 할 수 있으므로 재사용 가능한 자원을 저장하기 위해 메모리가 추가로 지출하고해야합니다.

당신이 어떤 캐시 자원을 시작하기 전에 그래서, 즉 자주 사용되어 있는지 확인하십시오.

추천

출처www.cnblogs.com/xuyiding/p/11621903.html