일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- android
- oracle
- flet
- spring data jpa
- JVM
- write by GPT-4
- 자바
- chatGPT's answer
- spring integration
- 인프라
- NIO
- write by chatGPT
- 자바네트워크
- kotlin
- 시스템
- 웹 크롤링
- 코틀린
- 자바암호
- python
- 파이썬
- GPT-4's answer
- 리눅스
- Java
- 소프트웨어공학
- 고전역학
- Database
- 데이터베이스
- jpa
- 역학
- 유닉스
- Today
- Total
기억을 지배하는 기록
Java performance tips-1 본문
Java Press (http://www.gihyo.co.jp/magazines/javapress) 라는 일본의 Java전문 서적(2003년 2월판)에서 발췌한 Java performance tips입니다.
그중 Java 일반적사항에 관련하여 7개, String 관련2개, Collection관련 8개, IO관련2개,
등 총 4개 분야 19여개의 Tips에 대해 설명하겠습니다.
1. 일반적사항 관련 Tips
① 쓸데없이 Cast를 남발하면 바람직하지 않음.
Loop구조에서 쓸데없이 cast를 남발하면 performance를 현저히 저하시킵니다.
예) 쓸데없이 cast를 남발한 바람직하지 않은 코드예
for(int i=0; i<list.size(); i++)
{
if ( ((String)list.get(i)).indexOf('a') ! =-1) {
} else if(((String)list.get(i)).indexOf('b') ! =-1) {
} else if(((String)list.get(i)).indexOf('c') ! =-1) {
} else if(((String)list.get(i)).indexOf('d') ! =-1) {
} ...
}
예) 쓸데없는 cast를 제거한 좋은 코드예
for (int i=0; i<list.size(); i++)
{
String value = (String)list.get(i);
if(value.indexOf('a') ! = -1) {
} else if ((value.indexOf('b') != -1){
} else if ((value.indexOf('c') != -1){
} else if ((value.indexOf('d') != -1){
} ...
}
② 쓸데없이 동기화를 행하면 바람직하지 않음
同期化(Synchronized)은 높은 cost입니다. 필요가 없을 시에는 사용하지 마십시요.
③ 쓸데없는 인스턴스생성은 바람직하지 않음
인스턴스수가 많지 않은 경우에는 별 문제가 되지 않겠지만, 많은 인스턴스를 생성 하는 경우에는 performance를 현저히 저하 시키므로 주의하십시요.
예) String 인스턴스를 2번생성한 바람직 하지 않은 코드예
String value = new String("문자열");
예) 개량 후 코드예
String value = "문자열";
④ 필요이상으로 Wrapper클래스를 사용하면 바람직하지 않음
Wrapper클래스(Integer, Boolean 등)을 클래스멤버로 사용하는 경우 인스턴스생성이 필요하게 되므로, 기본적으로 Primitive형을 사용하는 편이 performance를 높입니다.
예) Wrapper클래스를 사용한 코드예
public class Person {
private Integer id;
private Boolean isValid;
};
예) primitive형으로 치환한 코드예
public class Person {
private int id;
private boolean isValid;
};
또한 Wrapper클래스에는 없지만 java.math.BigDecimal 클래스는 Double 클래스 보다 정확한 부동소수연산이 가능하지만 performance를 저하시키므로 유의바랍니다.
⑤ primitive형의 default값을 이용
int형 boolean형등의 primitive형은 선언시 default값이 초기화 됩니다. 이것을 이용하면 초기화처리를 생략할 수 있습니다. 덧붙여 말하면 int형은 0, float은 0.0, boolean형은 false로 선언시에 초기화 됩니다.
예) primitive형의 초기화처리를 행한 코드예
public class Person {
private int id;
private boolean isValid;
public Person() {
id = 0;
isValid = false;
}
}
예) primitive형의 default값을 이용한 코드예
public class Person {
private int id;
private boolean isValid;
public Person() {
}
}
⑥ 문자열을 숫자형으로 변환하는 방법
문자열을 숫자형으로 변환시에 각 Wrapper클래스(Integer,Double 등)의 static 메소드인 parseXXX()를 이용합니다.
valueOf()를 경유해서 XXXValue()를 실행하면 한번의 인스턴스를 생성하게 되어 불필요한 cost를 들게 합니다.
예) valueOf()를 이용하여 문자열을 숫자형으로 변환한 코드예
double doubleValue = Double.valueOf("1234.56").doubleValue();
int intValue = Integer.valueOf("123456").intValue();
예) 개량한 코드예
double doubleValue = Double.parseDouble("1234.56");
int intValue = Integer.parseInt("123456");
⑦ 필요이상으로 System.gc()를 사용하면 바람직하지 않음
필요이상으로 System.gc()를 이용하면 프로그램실행 performance가 저하됩니다.
'오래된글 > Java' 카테고리의 다른 글
Java performance tips-3 (0) | 2018.04.09 |
---|---|
Java performance tips-2 (0) | 2018.04.09 |
Java 네트워크 - 6 (0) | 2018.04.09 |
Java 네트워크 - 5 (0) | 2018.04.09 |
Java 네트워크 - 4 (0) | 2018.04.09 |