오늘은 8+1 Tips to Optimize your Java Code에 대해 읽고 이 중 의미있는 내용들을 다루어볼 예정입니다. 9가지의 tip이지만 이 중 6가지의 Java Code 최적화 하는 방법에 대해 알아보는 시간을 가져보겠습니다.(세 가지 내용은 포괄적인 의미라 생각하여 6가지로 정리해봤습니다.)
다중 if-else문을 피합니다. if-else 문을 많이 사용할수록 JVM이 조건을 비교해야 하므로 성능에 영향을 미칩니다.
public boolean foo() {
if (condition1) {
if (condition2) {
if (condition3 || condition4) {
return true;
} else {
return false;
}
}
}
return false;
}
기존 조건문에서 return false가 되는 모든 상황을 선제적으로 반환하면 다음과 같은 코드로 작성할 수 있습니다.
public boolean foo() {
if (!(condition1 && condition2)) return false;
if (!(condition3 || condition4)) return false;
// Otherwise
return true;
}
해결 1번과 비슷하나, return false가 가능한 모든 조건식을 변수로 초기화하여 이를 사용합니다.
boolean result = (condition1 && condition2) && (condition3 || condition4)
return result;
or 로직을 함수에 넣어 바로 반환합니다.
public boolean conditionsMet() {
return (condition1 && condition2) && (condition3 || condition4);
}
반복문 안에서 최대한 연산을 제거합니다. 또한, 반복문에서 조건문 이용시 collection의 크기를 가져오는 것을 지양합니다.
for (int i = 0; i < arr.length; i++) {
arr[i] += i + (2 * y) * Math.sin(y);
}
double twoYsinY = (2 * y) * Math.sin(y);
int arrLength = arr.length;
for (int i = 0; i < arrLength; i++) {
arr[i] += i + twoYsinY;
}
for (i = 0; i < arr.length(); i++) {
// Do something
}
int length = arr.length();
for (i = 0; i < length; i++) {
// Do something
}
or
for (i = arrLength; --i >= 0; ) {
// Do something
}
반복문을 최대한 해체합니다. 반복문은 조건문을 반복한 숫자만큼 진행하기 때문에 반복문을 최소화하는 것이 좋습니다.
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);
}
String 객체 이용시 +를 사용할 경우, 계속해서 새로운 메모리에 String 객체를 생성해야 합니다.
최대한 + 연산자 사용을 지양합니다.
해결법은 다음과 같습니다.
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);
연산을 할 경우 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;
}