Java Code 최적화

겔로그·2022년 9월 28일
2

Java

목록 보기
6/10
post-thumbnail

개요

오늘은 8+1 Tips to Optimize your Java Code에 대해 읽고 이 중 의미있는 내용들을 다루어볼 예정입니다. 9가지의 tip이지만 이 중 6가지의 Java Code 최적화 하는 방법에 대해 알아보는 시간을 가져보겠습니다.(세 가지 내용은 포괄적인 의미라 생각하여 6가지로 정리해봤습니다.)

최적화 코드

1. Avoid multiple if-else statements

다중 if-else문을 피합니다. if-else 문을 많이 사용할수록 JVM이 조건을 비교해야 하므로 성능에 영향을 미칩니다.

예시

public boolean foo() {
    if (condition1) {
        if (condition2) {
            if (condition3 || condition4) {
                return true;
            } else {
                return false;
            }
        }
    }
    return false;
}

해결 1. 조기에 return문으로 탈출시킨다.

기존 조건문에서 return false가 되는 모든 상황을 선제적으로 반환하면 다음과 같은 코드로 작성할 수 있습니다.

public boolean foo() {
    if (!(condition1 && condition2)) return false;
    if (!(condition3 || condition4)) return false;
    // Otherwise
    return true;
}

해결 2. 변수를 사용한다.

해결 1번과 비슷하나, return false가 가능한 모든 조건식을 변수로 초기화하여 이를 사용합니다.

boolean result = (condition1 && condition2) && (condition3 || condition4)
return result;

or 로직을 함수에 넣어 바로 반환합니다.

public boolean conditionsMet() {
    return (condition1 && condition2) && (condition3 || condition4);
}

2. Make optimizations in loops

반복문 안에서 최대한 연산을 제거합니다. 또한, 반복문에서 조건문 이용시 collection의 크기를 가져오는 것을 지양합니다.

예시 1

for (int i = 0; i < arr.length; i++) {
    arr[i] += i + (2 * y) * Math.sin(y);
}

해결 1: 연산 부분을 분리하여 변수로 선언한 뒤, 반복문에 이용합니다.

double twoYsinY = (2 * y) * Math.sin(y);
int arrLength = arr.length;
for (int i = 0; i < arrLength; i++) {
    arr[i] += i + twoYsinY;
}

예시 2

for (i = 0; i < arr.length(); i++) {
    // Do something
}

해결 2: arr.length();와 같은 변수를 초기화 하여 이용합니다.

int length = arr.length();
for (i = 0; i < length; i++) {
    // Do something
}

or 

for (i = arrLength; --i >= 0; ) {
    // Do something
}

3. Unrolling loops

반복문을 최대한 해체합니다. 반복문은 조건문을 반복한 숫자만큼 진행하기 때문에 반복문을 최소화하는 것이 좋습니다.

예시

int x;
for (x = 0; x < 100; x++) {
    insert(x);
}

해결: 반복문을 해체하여 사용합니다.

int x; 
for (x = 0; x < 100; x += 5) {
    insert(x);
    insert(x + 1);
    insert(x + 2);
    insert(x + 3);
    insert(x + 4);
}

4. Don’t use “+” for Concatenation

String 객체 이용시 +를 사용할 경우, 계속해서 새로운 메모리에 String 객체를 생성해야 합니다.
최대한 + 연산자 사용을 지양합니다.
해결법은 다음과 같습니다.

  1. concat() method를 이용합니다.
  2. StringBuilder 또는 StringBuffer를 사용합니다.

예시

String query = String1 + String2 + String3;

해결

StringBuilder strBuilder = new StringBuilder("");
strBuilder.append(String1).append(String2).append(String3);
String finalString = strBuilder.toString();

or

String query = String1.concat(String2).concat(String3);

5. Be careful of autoboxing and avoid wrappers when you don’t need them

연산을 할 경우 Wrapper클래스 대신 primitive type을 이용합니다.
primitive type과 Wrapper 클래스간에는 엄청난 성능차이가 있으니 주의해서 사용해주시길 바랍니다.

예시

int sum = 0;
for (int i = 0; i < 1_000_000_000; i++) {
    sum += i;
}

해결

Integer sum = 0;
for (int i = 0; i < 1_000_000_000; i++) {
    sum += i;
}

Reference

8+1 Tips to Optimize your Java Code

profile
Gelog 나쁜 것만 드려요~

0개의 댓글