Java 성능 최적화 기술 요약

6150 단어 Java성능최적화
본고는 자바 성능 최적화 기교를 요약하였다.여러분에게 참고할 수 있도록 나누어 드리겠습니다.구체적인 분석은 다음과 같다.
여기 는 몇 가지 서적 을 참고하여 인터넷 자원 을 정리한 것 으로 대다수 자바 응용 프로그램 에 적합하다
JAVA 프로그램에서 성능 문제의 대부분은 JAVA 언어가 아니라 프로그램 자체에 있다.좋은 인코딩 습관을 기르는 것은 매우 중요하고 프로그램 성능을 현저하게 향상시킬 수 있다.
1. 가능한 한 피날레 수식자를 사용한다.
final 수식자가 있는 종류는 파생할 수 없다.JAVA 핵심 API 중에서final을 응용한 예가 많은데, 예를 들어java이다.lang.String.String 클래스에 final을 지정하면 사용자가 length () 를 덮어쓰는 것을 방지합니다.또한 만약에 한 종류가final의 것이라면 이 종류의 모든 방법은final의 것이다.자바 컴파일러는 인라인 (inline) 의 모든final 방법을 찾을 수 있습니다. (이것은 구체적인 컴파일러의 실현과 관련이 있습니다.)이 조치는 성능을 평균 50% 높일 수 있다.
2. 가능한 한 객체를 재사용합니다.
특히 String 대상의 사용에서 문자열 연결 상황이 발생하면 String Buffer로 대체해야 한다. 시스템이 대상을 생성하는 데 시간이 걸릴 뿐만 아니라 나중에 이 대상들을 쓰레기 수거하고 처리하는 데도 시간이 걸릴 수 있기 때문이다.따라서 너무 많은 대상을 생성하면 프로그램의 성능에 큰 영향을 미칠 수 있다.
3. 가능한 한 국부 변수를 사용한다.
방법을 호출할 때 전달되는 매개 변수와 호출에 생성된 임시 변수는 스택(Stack)에 저장되어 속도가 빠릅니다.정적 변수, 실례 변수 등 다른 변수는 무더기(Heap)에서 만들어져 속도가 느리다.
4. 초기화 변수를 반복하지 마십시오.
기본적으로 클래스의 구조 함수를 호출할 때 자바는 변수를 확정된 값으로 초기화하고 모든 대상은null, 정수 변수는 0,float와double 변수는 0.0, 논리 값은false로 설정합니다.하나의 클래스가 다른 클래스에서 파생될 때, 이 점은 특히 주의해야 한다. 왜냐하면 new 키워드로 대상을 만들 때, 구조 함수 체인의 모든 구조 함수가 자동으로 호출되기 때문이다.
구성원 변수에 초기 값을 설정하지만 다른 방법을 호출해야 할 때 initXXX () 같은 방법에 두는 것이 좋습니다. 어떤 방법을 직접 호출하면 클래스가 초기화되지 않아 포인터가 이상할 수 있기 때문입니다. public intstate =this.getState();
5. 자바+Oracle의 응용 시스템 개발에서 자바에 내장된 SQL 언어는 가능한 한 대문자 형식을 사용하여 Oracle 해석기의 해석 부담을 줄여야 한다.
6.java프로그래밍 과정에서 데이터베이스 연결, I/O 흐름 조작을 하고 사용이 끝난 후에 자원을 방출하기 위해 제때에 닫는다.이런 큰 대상에 대한 조작은 시스템에 큰 비용을 초래할 수 있기 때문이다.
7. 지나치게 창설 대상은 시스템의 대량의 메모리를 소모하고 심각할 때 메모리 유출을 초래할 수 있기 때문에 기한이 지난 대상의 신속한 회수를 확보하는 것은 중요한 의미를 가진다.
JVM의 GC는 지능적이지 않으므로 개체 사용이 끝난 후 수동으로 null로 설정하는 것이 좋습니다.
8. 동기화 메커니즘을 사용할 때 코드 블록 동기화 대신 가능한 한 방법을 동기화해야 한다.
9. 변수에 대한 중복 계산을 최소화한다.
예컨대

for(int i=0;i<list.size();i++) 
다음과 같이 수정해야 합니다.

for(int i=0,len=list.size();i<len;i++)
10. 필요할 때 만드는 정책을 사용합니다.
예:

String str="abc";
if(i==1){ list.add(str);}
다음과 같이 수정해야 합니다.

if(i==1){String str="abc"; list.add(str);}
11. 이상 사용을 조심하라. 이상은 성능에 불리하다.
이상을 던지려면 먼저 새로운 대상을 만들어야 합니다.Throwable 인터페이스의 구조 함수 호출 이름이 fillInStackTrace()인 로컬 방법, fillInStackTrace() 방법 검사 창고, 호출 추적 정보를 수집합니다.예외가 발생하면 VM은 처리 과정에서 새로운 대상을 만들었기 때문에 호출 창고를 조정해야 합니다.
이상은 오류 처리에만 사용할 수 있으며, 프로그램 프로세스를 제어하는 데 사용해서는 안 된다.
12. 순환에서 Try/Catch 문구를 사용하지 말고 Try/Catch를 순환의 가장 바깥쪽에 두어야 한다.
Error는 시스템 오류를 가져오는 클래스이거나 가상 시스템 오류를 가져오는 클래스입니다.모든 오류 Exception에서 얻을 수 있는 것은 아닙니다. 가상 머신이 오류를 보고하면 Exception에서 얻을 수 없습니다. Error로 가져와야 합니다.
13. StringBuffer의 구조 함수를 통해 그의 초기화 용량을 설정하면 성능을 뚜렷하게 향상시킬 수 있다.
StringBuffer의 기본 용량은 16입니다. StringBuffer의 용량이 최대 용량에 도달하면 자신의 용량을 현재의 2배+2, 즉 2*n+2로 증가시킵니다.언제든지 String Buffer가 최대 용량에 도달하면 새로운 대상 그룹을 만들고 낡은 대상 그룹을 복사해야 하기 때문에 많은 시간을 낭비할 수 있습니다.그래서 StringBuffer에 합리적인 초기화 용량 값을 설정하는 것이 필요합니다!
14. 자바를 합리적으로 사용한다.util.Vector.
Vector는 StringBuffer와 유사하며 용량을 확장할 때마다 모든 기존 요소가 새 저장 공간에 값을 부여해야 합니다.Vector의 기본 스토리지 용량은 10가지 요소로 두 배로 확장됩니다.
vector.dd(index,obj) 이 방법은 요소obj를 index 위치에 삽입할 수 있지만, index와 그 후의 요소는 순서대로 한 위치를 아래로 이동합니다.필요하지 않으면 성능에 불리하다.
같은 규칙은remove (int index) 방법에 적용되며, 이 벡터에서 지정한 위치의 요소를 제거합니다.모든 후속 요소를 왼쪽으로 이동합니다.이 벡터에서 제거된 요소를 되돌려줍니다.그래서vector의 마지막 요소를 삭제하는 것은 첫 번째 요소를 삭제하는 것보다 비용이 훨씬 낮다.모든 요소를 삭제하려면 removeAllElements() 메서드를 사용하는 것이 좋습니다.
vector의 요소를 삭제하려면vector를 사용할 수 있습니다.remove(obj);요소 위치를 스스로 검색하고 삭제할 필요가 없습니다. 예를 들어 int index = index Of(obj);vector.remove(index);
15. 대량의 데이터를 복제할 때 System을 사용합니다.arraycopy();
16. 코드 재구성으로 코드의 가독성을 높인다.
17. new 키워드로 대상을 만드는 실례를 사용하지 않습니다.
new 키워드로 클래스의 실례를 만들 때, 구조 함수 체인의 모든 구조 함수는 자동으로 호출됩니다.그러나 만약 대상이 Cloneable 인터페이스를 실현한다면, 우리는 그녀의 clone () 방법을 호출할 수 있다.clone () 방법은 어떤 종류의 구조 함수도 호출하지 않습니다.
다음은 Factory 모델의 전형적인 실현이다.

public static Credit getNewCredit()
{
  return new Credit();
}
 clone() ,
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit()
{
  return (Credit)BaseCredit.clone();
}
18. 곱셈법은 비트레이트를 사용할 수 있다면 가능한 한 비트레이트를 사용해야 하지만 비트레이트 조작이 직관적이지 않아 이해하기 어렵다.
19. 그룹을 public static final로 표시하지 마십시오.
20. HaspMap의 범주.

Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Entry<String, String[]> entry : paraMap.entrySet() )
{
  String appFieldDefId = entry.getKey();
  String[] values = entry.getValue();
}
산열 값을 이용하여 상응하는 Entry를 추출하여 비교한 결과 entry의 값을 얻은 후 키와value를 직접 추출합니다.
21.array 및 ArrayList를 사용합니다.
array 수조는 효율이 가장 높지만 용량이 고정되어 동적 변화가 불가능합니다. Array List 용량은 동적 성장이 가능하지만 효율을 희생합니다.
22. 단일 스레드는 가능한 한 HashMap, Array List를 사용해야 한다. 필요하지 않으면 HashTable, Vector를 추천하지 않는다. 그들은 동기화 메커니즘을 사용하고 성능을 떨어뜨린다.
23. StringBuffer, StringBuilder의 차이점은:java.lang. StringBuffer 스레드가 안전한 가변 문자 시퀀스입니다.String과 유사한 문자열 버퍼이지만 수정할 수 없습니다.StringBuilder는 이 클래스에 비해 StringBuilder 클래스를 우선적으로 사용해야 합니다. 모든 같은 동작을 지원하지만 동기화를 실행하지 않기 때문에 속도가 더 빠릅니다.더 좋은 성능을 얻기 위해서는 String Buffer나 String Builder를 구성할 때 가능한 한 그녀의 용량을 지정해야 한다.물론 16자를 넘지 않을 때는 쓰지 않는다.
같은 상황에서 StringBuilder를 사용하는 것은 StringBuffer를 사용하는 것보다 10%~15%의 성능 향상을 얻을 수 있지만 다중 스레드가 안전하지 않을 위험을 무릅쓰게 된다.종합적으로 고려해서 StringBuffer를 사용하는 것이 좋습니다.
24. 가능한 한 기본 데이터 형식을 사용하여 대상을 대체한다.
25. 복잡한 함수 계산을 간단한 수치 계산으로 대체한다. 예를 들어 표 검사 방식으로 삼각 함수 문제를 해결한다.
26. 구체적인 종류를 사용하는 것이 인터페이스를 사용하는 것보다 효율이 높지만 구조의 탄력성은 낮아졌지만 현대 IDE는 이 문제를 해결할 수 있다.
27. 정적 방법을 고려하다
만약 당신이 대상의 외부를 방문할 필요가 없다면, 당신의 방법은 정태적인 방법이 될 것이다.가상 함수 안내표가 필요하지 않기 때문에 그녀는 더 빨리 호출될 것이다.이 동료도 좋은 실천이다. 왜냐하면 그녀는 너에게 방법의 성질을 어떻게 구분하는지 알려주기 때문에 이 방법을 사용하면 대상의 상태를 바꾸지 않을 것이다.
28. 가능한 한 내재된 GET, SET 방법을 사용하지 않아야 한다.
android 프로그래밍에서 허위 방법의 호출은 실례 속성 조회보다 많은 대가를 치르게 됩니다.우리는 아웃소싱을 할 때 get, set 방법을 사용해야 하지만, 내부에서 호출할 때 직접 호출해야 한다.
29. 매거, 부동점수의 사용을 피한다.
30. 2차원 그룹은 1차원 그룹보다 더 많은 메모리 공간을 차지하는데 대략 10배로 계산한다.
31.SQLite 데이터베이스에서 전체 테이블의 모든 데이터를 읽는 것은 매우 빠르지만 조건이 있는 조회는 30-50MS가 소모됩니다. 여러분들은 이 방면을 할 때 주의해야 합니다. 가능한 한 적게 사용하십시오. 특히 플러그인 찾기!
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기