본문 바로가기
잡담/궁금증 해결

Map<String, List<String>> 관련 clear()

by lms0806 2024. 2. 26.
728x90
반응형

자바에서 특정 key에 대한 value로 list를 지정하여 해당 key에 대하여 값들을 모아두는 형태로 코드를 작성하는 경우가 있습니다.

Map<String, List<String>> map = new HashMap<>();

이런 경우 GC가 발생하게 된다면 어떻게 될까요?

 

값들을 저장해서 계속 사용한다면 괜찮겠지만, 이렇게 만들어두고 값을 전달한 후, 더이상 사용하지 않는 경우에서 gc가 발생할 경우?

 

이런 형태로 해당 값이 사용중인지 확인하는 단계를 거치게 될 것입니다.

'그치만 값 전달 후 map.clear()를 통해 map을 비워버리면? gc는 해당 map이 바로 사용하지 않는 상태라는 것을 확인하여 지우는데 오랜 시간이 걸리지 않을까?' 라는 생각을 하게 되었습니다.

 

map.clear()를 하면 gc가 발동하기 전 실제 프로그램 속도에 영향이 더 끼치는거 아니야?

 

라는 반대 의견에 대응하기 위하여 테스트를 해봤습니다.

직접 GC가 발동될때까지 메모리를 저장할 수 없어, System.gc()를 활용하여 직접 gc를 발동해 테스트를 진행하였습니다.

 

  • clear를 하지 않은 경우
long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
        
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(int i = 0; i < 10000000; i++) {
	map.put(String.valueOf(i), list);
}

long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);
		
beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
        
System.gc();
		        
afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);

 

결과

시간차이(ms) : 916
시간차이(ms) : 290

 

  • map.clear()를 사용하는 경우
long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
        
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(int i = 0; i < 10000000; i++) {
	map.put(String.valueOf(i), list);
}
map.clear();

long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);
		
beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
        
System.gc();
		        
afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);

 

결론

시간차이(ms) : 939
시간차이(ms) : 13

 

  • 실험 결론
    • 프로그램이 작동하는데 map.clear()를 사용해 약간의 시간이 더 소요하게 됨
    • 그러나, gc 발동 시 시간은 확연하게 차이가 날 정도로 적게 소요하게 된다.
    • 사용하지 않는 변수의 경우 clear()를 통해 비워주면 좋을 것같다

 

여기서 clear()관련 이슈가 발생합니다.

https://www.acmicpc.net/board/view/90885

 

글 읽기 - 데이터 추가 요청드립니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

이전 제가 백준을 통해 냈던 문제 관련해서 저격 소스 중, clear()에 대해 나온 글이 있습니다.

 

이를 토대로 테스트해본 결과, clear()를 통해 초기화 보다는 null이나 재선언 방식으로 할당하는 게, 시간이 더 적게 소요된다는 것을 발견하였습니다.

HashMap<String List<String>> map = new HashMap<>();

map = null;
map = new HashMap<>();

 

728x90
반응형

'잡담 > 궁금증 해결' 카테고리의 다른 글

변수 선언 후 인자 전달 vs 인자 전달  (1) 2024.02.14
비트연산 과연 더 빠른가?  (1) 2023.02.28

댓글