Java 프로그래밍 코드 성능 최적화
1.효율성(가장 중요)
2.가독성으로 후기 유지보수에 편리하다.(똑같이 중요)
2. 코드 최적화 요구 사항:
1.코드의 부피를 줄이다.
2.코드의 운행 효율을 높이다.
3. 자주 사용하는 코드의 최적화:
1. 가능한 한 객체를 재사용합니다.
특히 String 객체의 재사용.가장 자주 사용하는 것은 문자열의 결합이다.
스왑 스트링이 자주 지워지는 경우StringBuilder/StringBuffer를 꼭 사용하세요.
예:
ArrayList<String> list;
// list 。
StringBuilder builder = new StringBuilder();
for (String s : list) {
builder.append(s);
}
String result = builder.toString();
원인: 자바 가상 시스템은 대상을 생성하는 데 시간이 걸릴 뿐만 아니라 대상을 처리하고 회수하는 데도 시간이 걸리기 때문에 너무 많은 대상을 생성하면 반드시 프로그램 성능에 영향을 미칠 것이다.2. 가능한 한 로컬 변수를 사용합니다.
국부 변수는 창고에서 생성되며 생성 속도가 빠르고 다 사용하면 자동으로 사라지며 추가 쓰레기 회수가 필요하지 않습니다.
반면에 정적 변수, 실례 변수 등은 더미에서 만들어지고 생성 속도가 느리며 자바 쓰레기 회수 메커니즘에 의존한다.
3. 흐름 즉시 닫기:
Java 프로그램 개발에서는 I/O, 데이터베이스 작업이 끝난 후에 흐름을 닫는 것을 기억해야 합니다.
원인: 폐쇄되지 않은 흐름은 시스템에 큰 비용을 초래하고 심지어 데이터에 심각한 결과를 초래할 수 있다.
4. 게으름을 사용하여 로드
게으름 불러오기: 사용할 때 이 대상을 만듭니다.
예:
String prefix = "gebi";
if ("laowang".equals(name)) {
list.add(prefix + name);
}
다음으로 대체:
if("laowang".equals(name)) {
String prefix = "gebi";
list.add(prefix + name);
}
5.순환에서try를 사용하지 않기...catch, 순환 바깥쪽에서try 사용...catch6.try...catch는 너무 크면 안 돼요.
쓸모없는 코드, 즉 이상한 코드를 던지지 않고 모두try에 넣지 마...catch 블록에서try 줄이기...catch 코드 블록의 크기입니다.
코드의 가독성, 유지보수성, 건장성을 보증합니다.
7.순환 내에서 대상의 인용을 최대한 피하십시오.
특히 순환량이 많을 때
while (i<1000) {
Object object = new Object();
}
다음과 같이 수정하는 것이 좋습니다.
Object object = null;
while (i<1000) {
object = new Object();
new Object() 때마다 Object 객체 참조는 Object 객체를 가리킵니다.순환 횟수가 많을 때 첫 번째와 같이 JVM은 1000개의 객체에 대한 참조를 만들고, 두 번째 메모리에는 Object 객체 참조가 하나밖에 없습니다.이렇게 하면 메모리 공간을 크게 절약할 수 있다.
8.static 변수를 함부로 사용하지 마세요.
대상이 static 변수로 인용되었을 때, 자바 쓰레기 수거기는 이 대상이 차지하는 메모리를 정리하지 않습니다.
정적 변수가 차지하는 메모리는 이 변수가 있는 클래스가 끝날 때까지 방출됩니다.정적 변수 라이프 사이클 = 클래스 라이프 사이클입니다.
9.사용하지 않는 대상을 만들지 마십시오. 사용하지 않는 클래스를 가져오지 마십시오.
10.버퍼링된 입출력 흐름 사용:
버퍼링이 있는 입출력 흐름은 입출력 효율을 크게 높일 수 있다.BufferedWriter, BufferedReader, BufferedInputStream, BufferedOutputStream.
11.패키지 클래스 데이터를 문자열로 변환하기 사용: toString
Integer i = 1;
패키지 클래스 데이터를 문자열로 변환하는 방법 속도 순위:
i.toString > String.valueOf(i) > ""+ i
12.맵 스트리밍 효율:entrySet > keySet
//entrySet()
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " : " + value);
}
//
//keySet()
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(key + " : " + value);
}
13.Iterator 및 forEach () 에 대한 컬렉션은 무시됩니다.알고리즘 도론에 따르면 알고리즘은 공간 효율과 시간 효율을 높이기 위한 것이다.그러나 왕왕 시간과 공간이 병존할 수 없다.
시간 효율: Iterator > forEach()
코드 가독성: forEach() > Iterator
//Iterator
Set<Entry<String, String>> entrySet = map.entrySet();
Iterator<Entry<String, String>> iter = entrySet.iterator();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " : " + value);
}
비교:
//forEach()
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " : " + value);
}
개인적으로는 빅데이터를 처리할 때 Iterator를 사용하여 컬렉션을 훑어보는 것을 추천합니다.그러나 작은 데이터를 처리하면 가독성과 후기 유지보수를 위해 forEach () 를 사용합니다.
양자를 결합하여 사용하려면 모두 파악해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.