2011년 6월 9일 목요일

Java performance tips-3

3. Collection관련 Tips
① 배열의 이용
데이타의 개수나 사이즈가 변동하는 경우에만 Collection계통의 클라스를 사용하며, 그외에는 배열을 사용합니다.

② J2SE1.2이상에서의 Collection이용
JDK1.1까지는 Vector클래스나 Hashtable클래스가 편리했으나, 이러한 클래스는 메소드가 동기화(synchronized) 되어 있습니다. 따라서 동기화가 필요없는 경우에는 비효율적입니다.
J2SE1.2이상에서는 메소드가 동기화되어있지 않은 ArrayList클라스나 HashMap 클래스를 이용합니다.
Vector클래스는 ArrayList로 Hashtable은 HashMap클래스로 바꿔이용합니다.

예) 구 Collection클래스 이용예
Vector vector = new Vector();
Hashtable table = new Hashtable();

예) J2SE1.2이상 Collection클래스 이용예
List list = new ArrayList();
Map map = new HashMap();
또한, J2SE1.2이상에서 Collection의 동기화가 필요한 경우에는
List list = Collection.synchronizedList(new ArrayList(..));
위와 같이 사용합니다.

③ Collection size 초기화
Collection을 default 사이즈로 만들면, 필요시 자동적으로 사이즈가 확장되나 명확히 예측이 가능한 경우에는 사이즈를 초기화 하는 편이 훨씬 효율적입니다.

예) 사이즈를 지정하지 않고 Collection을 생성한 코드예
List list = new ArrayList();
HashMap map = new HashMap();

예) 사이즈를 지정한 Collection 생성 코드예
List list = new ArrayList(num);
HashMap map = new HashMap(num);

④ Iterator클래스보다 빠른 요소검사
Collection 사이즈를 명확히 알 경우에는 Iterator클래스의 next()와 비교하여,
Iterator클래스의 hasNext()에 의한 요소종료 체크가 필요없으며 내부처리가 간단한 List클래스 get()메소드를 추천합니다.

예) Iterator클래스의 next()에 의한 요소조사
Iterator iterator = array.iterator();
while (iterator.hasNext())
{
Object object = iterator.next();
}

예) List클래스의 get()에 의한 요소조사
int size =array.size();
for (int i=0; i
{
Object object = array.get(i);
}

⑤ 요소삽입/삭제시 주의점
List도중에 요소를 추가/삭제할 경우에 내부적으로 배열의 copy가 행해집니다.
따라서 요소의 수가 많으면 많을 수록 copy하는 요소수도 많아져 결과적으로 performance의 저하를 초래합니다. 내부적처리로써 [ (전체사이즈) - (삽입/삭제대상요소의 index)] 만큼의 요소가 copy되므로 아래의 예를 참조바랍니다.

예) List의 맨앞에 요소를 추가/삭제하는 경우 -- 속도가 느림.
list.add(0, new Object());
list.remove(0);

예) List의 맨 뒤에 요소를 추가/삭제하는 경우 -- 속도가 빠름.
list.add(new Object());
list.remove(list.size() - 1);

⑥ List요소 전체삭제
List요소를 전체삭제 할때, 통상 쓰는 clear()을 이용하지말고, 새롭게 List를 생성(초기화)하는 편이 효율적입니다. 왜냐하면, clear()는 내부적으로 보유하고 있는 배열의 전체요소에 null을 셋팅함으로써 전체삭제를 실현하기 때문입니다.

예) clear()에 의한 요소 전체삭제
List list = new ArrayList();
for(int i=0; i< num; i++) {
list.add(new Integer(i));
}
list.clear();

예) List재작성에 의한 요소 전체삭제
List list = new ArrayList();
for(int i=0; i< num; i++) {
list.add(new Integer(i));
}
list = new ArrayList();

⑦ 배열요소 copy방법
루프를 돌며 배열요소를 하나씩 copy할 경우에는 System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)를 이용합니다.
메소드의 인자는 아래와 같습니다.
src - the source array.
srcPos - starting position in the source array.
dest - the destination array.
destPos - starting position in the destination data.
length - the number of array elements to be copied.

예) 루프를 돌며 배열소소를 copy하는 예
int[] buf = new int[num];
int[] copy = new int[num];
for (int i=0; i
{
copy[i] = buf[i];
}

예) System.arraycopy()에 의한 신속한 copy 예
int[] buf = new int[num];
int[] copy = new int[num];
System.arraycopy(buf,0, copy,0, num);

⑧ List에 보존되어 있는 object 요소를 배열에 넣는 방법
List클래스의 toArray()를 이용하여 List에 보존되어 있는 Object요소를 배열에 넣습니다.

예) 루프에 의한 object요소 copy 예
int size = list.size();
Integer[] result = new Integer[size];
for (int i=0; i
{
result[i] = (Integer) list.get(i);
}

예) toArray()에 의한 신속한 copy
int size = list.size();
Integer[] result = new Integer[size];
list.toArray(result);

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...