코드 최적화 세부 사항
1. 클래스 및 메소드의 최종 수정자를 지정하십시오. 최종 수정자를 갖는 최종 수정자가있는 클래스는 도출 할 수 없습니다. Java Core API에는 java.lang.string과 같은 최종 적용의 많은 예가 있으며 전체 클래스는 최종입니다. 클래스의 최종 수정자를 지정하면 클래스가 상속되는 것을 방지 할 수 있으며, 메소드의 최종 수정자를 지정하면 메소드가 재정의되지 않을 수 있습니다. 클래스가 최종으로 지정되면 해당 클래스의 모든 방법은 최종입니다. Java 컴파일러는 모든 최종 방법을 인화 할 수있는 기회를 찾습니다. 인라인은 Java 운영 효율성을 향상시키는 데 큰 의미가 있습니다.
2. 객체, 특히 문자열 객체의 사용을 재사용하십시오. 문자열 연결이 발생하면 StringBuilder/StringBuffer를 대신 사용해야합니다. Java Virtual Machines는 객체를 생성하는 데 시간을 소비해야 할뿐만 아니라 향후 이러한 객체를 수집하고 처리하는 데 쓰레기를 소비해야 할 수도 있으므로 너무 많은 객체를 생성하면 프로그램의 성능에 큰 영향을 미칩니다.
3. 로컬 변수를 사용하여 가능한 한 많은 방법을 호출하십시오. 호출 방법과 통화에서 생성 된 임시 변수가 스택에 더 빨리 저장 될 때 매개 변수가 전달되었습니다. 정적 변수, 인스턴스 변수 등과 같은 다른 변수는 힙에 생성되며 속도가 느려집니다. 또한 스택에서 생성 된 변수가 완료되면 이러한 내용이 사라지고 추가 쓰레기 수집이 필요하지 않습니다.
4. 시간에 흐름을 닫습니다
Java 프로그래밍 중에 데이터베이스 연결 및 I/O 스트리밍 작업을 수행 할 때주의하십시오. 사용 후 시간을 닫아 리소스를 릴리스하십시오. 이러한 큰 물체의 작동은 큰 시스템 오버 헤드를 유발하고 조심하지 않으면 심각한 결과를 초래할 것입니다.
5. 변수의 반복 계산을 최소화하고 개념을 명확하게하십시오. 이 방법에 문장이 하나만 있더라도 스택 프레임 생성, 메소드를 호출 할 때 사이트 보호 및 메소드를 호출 할 때 사이트를 복원하는 등에도 여전히 소비됩니다. 예를 들어 다음 작업은 다음과 같습니다.
for (inti = 0; i <list.size (); i ++)
{...}는 다음과 같이 대체하는 것이 좋습니다.
for (inti = 0, length = list.size (); i <length; i ++)
{...}
이런 식으로 List.Size ()가 매우 커지면 많은 소비가 줄어 듭니다.
6. 게으른 적재 전략을 채택하려고 노력하십시오. 즉, 필요할 때 창조하십시오.
7.주의해서 이상을 사용하는 것은 성능에 해로울 것입니다. 예외를 던지려면 먼저 새 개체를 만들어야합니다. Throwable 인터페이스의 생성자는 Fillinstacktrace ()라는 로컬 동기화 방법을 호출합니다. FillInstackTrace () 메소드는 스택을 확인하고 통화 추적 정보를 수집합니다. 예외가 발생하는 한, Java 가상 머신은 처리 중에 새 개체가 생성되므로 통화 스택을 조정해야합니다. 예외는 오류 처리에만 사용될 수 있으며 프로그램 흐름을 제어하는 데 사용해서는 안됩니다.
8. 시도하지 마세요 ... 캐치 ... 루프에서 가장 바깥 쪽 층에 배치해야합니다.
네티즌이 제시 한 의견에 따르면, 나는 이것이 논의 할 가치가 있다고 생각합니다.
9. 추가 할 컨텐츠 길이를 추정 할 수 있다면 Arraylist, LinkedLlist, StringBuilder, StringBuffer, Hashmap, Hashset 등과 같은 배열에서 구현 된 컬렉션 및 도구 클래스의 초기 길이를 지정하십시오.
(1) StringBuilder () // 16자를 할당하기위한 기본값 (2) StringBuilder (int size) // 16 문자를 할당하기 위해 기본값 (3) StringBuilder (Stringbuilder) // 16 자 + str.length () 문자 공간을 할당하기 위해 기본값을 클래스의 생성자를 통해 초기화 용량을 설정할 수 있습니다 (여기서는 StringBuilder를 참조 할 수 없습니다). 예를 들어, StringBuilder, 길이는 현재 StringBuilder가 유지할 수있는 문자 수를 나타냅니다. StringBuilder가 최대 용량에 도달하면 용량을 2 배로 증가시키고 2를 추가 할 수 있습니다. StringBuilder가 최대 용량에 도달 할 때마다 새 문자 배열을 생성하고 이전 문자 배열 컨텐츠를 새로운 문자 배열에 복사해야합니다. 이것은 매우 성능이 높은 작업입니다. 길이를 지정하지 않고 5000 문자가 문자 배열에 저장되어 있다고 추정 할 수 있다면 5000에 가장 가까운 2의 전력은 4096이며, 각 확장에 추가 된 2는 2에 관계없이 다음과 같습니다.
(1) 4096을 기준으로, 8194 크기의 문자 배열을 신청하는데, 여기에는 최대 12290 크기의 문자 배열이 한 번에 추가됩니다. 처음에 5000 크기의 문자 배열을 지정할 수 있다면 공간의 두 배 이상을 절약 할 수 있습니다 (2) 원래 4096 문자를 새로운 문자 배열에 복사하여 메모리 공간을 낭비 할뿐만 아니라 코드 작동 효율성을 줄입니다. 따라서 기본 배열에서 구현 된 컬렉션 및 도구 클래스에 대한 합리적인 초기화 용량을 설정하는 것은 잘못된 것이 아니므로 즉각적인 결과를 가져올 것입니다. 그러나 배열 + 링크 된 목록에서 구현 된 해시 맵과 같은 컬렉션은 초기 크기를 예상 크기와 동일하게 설정해서는 안됩니다. 테이블에 연결된 하나의 객체 만 거의 0이기 때문에 초기 크기를 N 전원 2로 설정하는 것이 좋습니다. 2,000 개의 요소가있는 경우 New HashMap (128) 및 New Hashmap (256)으로 설정할 수 있습니다.
10. 많은 양의 데이터를 복사 할 때 System.ArrayCopy () 명령을 사용하십시오.
11. 곱셈 및 분할 사용 시프트 작업
12. 루프에서 객체 참조를 지속적으로 생성하지 마십시오.
예를 들어:
for (inti = 1; i <= count; i ++) {object obj = newObject (); }이 접근법은 Count Object Object Reference가 메모리에 존재하게합니다. 카운트가 크면 메모리를 소비합니다. 다음으로 변경하는 것이 좋습니다.
Object obj = null; for (inti = 0; i <= count; i ++) {obj = newObject ();} 이런 식으로 메모리에는 객체 객체 참조가 하나뿐입니다. 새 개체 ()가 사용될 때마다 객체 객체 참조는 다른 객체를 가리키지 만 메모리에는 하나의 객체 만 있으므로 메모리 공간이 크게 저장됩니다.
13. 효율성 및 유형 검사를 고려하여 배열을 최대한 많이 사용해야합니다. Arraylist는 배열 크기를 결정할 수없는 경우에만 사용해야합니다.
14. Hashmap, Arraylist 및 StringBuilder를 사용하십시오. 스레드-안전이 필요하지 않으면 Hashtable, Vector 및 StringBuffer를 사용하지 않는 것이 좋습니다. 후자의 3 개는 동기화 메커니즘을 사용하여 성능 오버 헤드를 가지고 있습니다.
15. 배열을 공개 정적 결승으로 선언하지 마십시오
이것은 의미가 없기 때문에 참조를 정적 최종으로 정의하고 배열의 내용은 여전히 마음대로 변경 될 수 있습니다. 배열을 공개로 선언하는 것은 보안 취약점이므로 외부 클래스에서 배열을 변경할 수 있음을 의미합니다.
16. 적절한 경우에 싱글 톤을 사용하십시오. 싱글 톤을 사용하면로드 부담을 줄이고 로딩 시간을 단축하며 로딩 효율을 향상시킬 수 있습니다. 그러나 모든 장소가 싱글 톤에 적합한 것은 아닙니다. 간단히 말해서, 싱글 톤은 주로 다음 세 가지 측면에 적용됩니다.
(1) 자원 사용을 제어하고 스레드 동기화를 통해 자원의 동시 액세스를 제어합니다 (2) 자원을 저장하기위한 인스턴스 생성을 제어합니다. (3) 데이터 공유를 제어하고 직접 연관성을 설정하지 않고 직접 연관성을 설정하지 않고 다수의 관련없는 프로세스 또는 스레드 간의 통신을 가능하게합니다.
17. 마음대로 정적 변수를 사용하지 마십시오
공개 클래스 A {private static b b = newb (); } 이 시점에서 정적 변수 B의 수명주기는 클래스 A와 동일합니다. 클래스 A가 제거되지 않으면 참조 B로 가리키는 B 객체는 프로그램이 종료 될 때까지 메모리에 상주합니다.
18. 시간이 더 이상 필요하지 않습니다. 더 이상 활성 세션을 지우려면 많은 응용 프로그램 서버에는 일반적으로 30 분 동안 기본 세션 타임 아웃이 있습니다. 애플리케이션 서버가 더 많은 세션을 저장 해야하는 경우 메모리가 충분하지 않은 경우 운영 체제는 데이터의 일부를 디스크로 전송합니다. Application Server는 MRU (최근에 가장 자주 사용되는) 알고리즘에 따라 일부 비활성 세션을 디스크에 버릴 수 있으며 메모리 예외가 충분하지 않을 수도 있습니다. 세션이 디스크에 버려 지려면 먼저 직렬화해야합니다. 대규모 클러스터에서는 직렬화 객체가 비싸다. 따라서 세션이 더 이상 필요하지 않은 경우 httpsession의 invalidate () 메소드를 제 시간에 호출하여 세션을 지워야합니다.
19. ArrayList와 같은 RandomAccess 인터페이스를 구현하는 컬렉션의 경우 Foreach Loop 대신 가장 일반적인 루프를 사용하여 JDK가 사용자에게 권장합니다. RandomAccess 인터페이스에 대한 JDK API의 설명은 다음과 같습니다. RandomAccess 인터페이스 구현은 빠른 랜덤 액세스를 지원하는 것을 나타내는 데 사용됩니다. 이 인터페이스의 주요 목적은 일반 알고리즘이 동작을 변경하여 무작위 또는 연속 액세스 목록에 적용될 때 우수한 성능을 제공 할 수 있도록하는 것입니다. 실제 경험에 따르면 RandomAccess 인터페이스를 구현하는 클래스 인스턴스에 무작위로 액세스하는 경우 루프에 일반을 사용하는 효율이 Foreach 루프를 사용하는 것보다 높습니다. 반대로, 순차적으로 액세스하면 반복기를 사용하는 것이 더 효율적입니다. 다음과 유사한 코드를 사용하여 판단 할 수 있습니다.
if (list instanceOfrandomAccess) {for (inti = 0; i <list.size (); i ++) {}} else {iterator <?> iterator = list.terable (); while (iterator.hasnext ()) {iterator.next ()}} Foreach Loop의 기본 구현 원칙은 반복자이므로, 문장의 후반부는 "순차적으로 액세스 할 경우 반복기를 사용하여 더 효율적일 것"이라는 것은 순차적으로 액세스하는 클래스 인스턴스를 의미하며, Foreach 루프를 사용하여 트래버스를 사용한다는 것을 의미합니다.
20. 동기화 방법 대신 동기화 된 코드 블록을 사용하는 것은 다중 스레드 모듈의 동기화 된 잠금 메서드 블록 기사에서 매우 명확하게 설명되었습니다. 전체 메소드를 동기화해야한다는 것을 결정할 수 없다면 동기화 된 코드 블록을 사용하여 동기화 할 필요가없는 코드를 동기화하지 않아 코드 실행 효율에 영향을 미칩니다.
21. 상수를 정적 최종으로 선언하고 자본으로 이름을 지정하여 이러한 내용이 컴파일 중에 일정한 풀에 넣을 수 있도록 런타임 동안 생성 된 상수 값의 계산을 피하십시오. 또한 자본에서 상수 이름의 이름을 지정하면 상수와 변수의 차이를 촉진 할 수 있습니다.
22. 사용하지 않은 개체를 만들지 말고 미사용 클래스를 가져 오지 마십시오.
이것은 말이되지 않습니다. "로컬 변수 I의 값이 사용되지 않는 경우"및 "import java.util이 사용되지 않는다"는 코드에 나타나면 이러한 쓸모없는 내용을 삭제하십시오.
23. 프로그램 작동 중 반사 사용을 피하십시오. 자세한 내용은 반사를 참조하십시오. 반사는 Java가 사용자에게 제공하는 매우 강력한 기능입니다. 강력한 기능은 종종 낮은 효율성을 의미합니다. 프로그램을 실행하는 과정에서 반사 메커니즘, 특히 메소드의 호출 메소드를 사용하는 것이 좋습니다. 실제로 필요한 경우, 프로젝트가 시작될 때 반사를 통해 객체를 인스턴스화하고 메모리에 넣는 것이 암시적인 접근법입니다. 사용자는 피어와 상호 작용할 때 가장 빠른 응답 속도에만 관심이 있으며 피어 프로젝트가 시작되는 데 걸리는 시간은 신경 쓰지 않습니다.
24. 데이터베이스 연결 풀과 스레드 풀을 사용하여 두 풀을 모두 재사용하는 데 사용됩니다. 전자는 연결의 빈번한 개방 및 폐쇄를 피할 수 있으며, 후자는 자주 생성과 실을 파괴하지 않을 수 있습니다.
25. IO 작업에 버퍼링 된 입력 및 출력 스트림 사용
버퍼 입력 및 출력 스트림, 즉 BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream, IO 효율성을 크게 향상시킬 수 있습니다.
26.보다 순차적 인 삽입 및 임의의 액세스가있는 장면에 ArrayList를 사용하고 더 많은 요소 삭제 및 중간 삽입이있는 장면에 LinkedList를 사용하십시오.
이것은 ArrayList 및 LinkedList의 원리를 이해함으로써 알려져 있습니다.
27. 공개 방법에서 너무 많은 공식 매개 변수를 두지 마십시오.
공개 방법은 외부 세계에 제공되는 방법입니다. 이러한 방법을 너무 많은 공식 매개 변수를 제공하면 두 가지 주요 단점이 있습니다.
1) 객체 지향 프로그래밍 아이디어 위반. Java는 모든 것이 대상이라는 것을 강조합니다. 너무 많은 공식 매개 변수는 객체 지향 프로그래밍 아이디어와 일치하지 않습니다.
2) 너무 많은 매개 변수는 필연적으로 메소드 호출에서 오류 확률을 증가시킵니다. 예를 들어, "너무 많은"가 3 또는 4를 참조하는 수는 jdbc를 사용하여 insertstudentinfo 메소드를 작성합니다. 학생 테이블에 10 개의 학생 정보 필드가 있습니다. 이 10 개의 매개 변수는 엔티티 클래스에서 삽입 메소드의 공식 매개 변수로 캡슐화 될 수 있습니다.
28. 문자열 변수와 문자열 상수를 쓰면 문자열 상수를 앞에 쓰는 것이 비교적 일반적인 트릭입니다. 다음 코드가있는 경우 :
String str = "123"; if (str.equals ( "123")) {...} 다음으로 수정하는 것이 좋습니다.
String str = "123"; if ( "123".equals (str)) {...} 이것은 주로 널 포인터 예외를 피할 수 있습니다
32. 기본 데이터 유형의 범위를 넘어서 하향 변환을 강제하지 마십시오.
33. 기본 데이터 유형을 문자열로 변환합니다. 기본 데이터 유형 .toString ()은 가장 빠른 방법이며, string.valueof (data) 및 data + "기본 데이터 유형을 세 가지 방법으로 변환하는 가장 느린 방법입니다. 정수 유형 데이터 i를 가지고 있습니다. I.toString (), string.valueof (i), i +" ". 세 가지 방법은 얼마나 효율적입니까? 테스트를 참조하십시오.
publicstatic void main (String [] args) {intlooptime = 50000; 정수 i = 0; longstarttime = System.CurrentTimeMillis (); for (intj = 0; } system.out.println ( "String.valueof () :" + (System.CurrentTimeMillis () -StartTime) + "MS"); STARTTIME = SYSTEM.CURRENTTIMEMILLIS (); for (intj = 0; } system.out.println ( "integer.toString () :" + (System.CurrentTimeMillis () -StartTime) + "MS"); STARTTIME = SYSTEM.CURRENTTIMEMILLIS (); for (intj = 0; j <looptime; j ++) {String str = i+""; } system.out.println ( "i + /" /":" + (System.currentTimeMillis () -StartTime) + "MS");}실행 결과는 다음과 같습니다.
String.valueof () : 11msinteger.tostring () : 5ms + "": 25ms
따라서 기본 데이터 유형을 향후 문자열로 변환하면 toString () 메소드를 사용하는 데 우선 순위를 부여해야합니다. 이유에 관해서는 매우 간단합니다.
1. String.valueof () 메소드를 맨 아래에서 integer.toString () 메소드라고하지만 호출하기 전에 짧은 판단을 내립니다.
2. integer.toString () 메소드에 대해 이야기하지 않겠습니다. 직접 호출하겠습니다.
3. I + ""의 하단 층은 StringBuilder를 사용하여 구현합니다. 먼저 Append Method를 사용하여 스 플라이싱 한 다음 Tostring () 메소드를 사용하여 문자열을 얻습니다. 분명히 가장 빠른 2, 가장 빠른 1, 가장 느린 3입니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.