Arraylist는 모든 리스트를 돌면서 내가 찾으려는 것인지 확인하고
Hashmap은 버킷을 만들고 그 버킷 내에 내가 찾으려는 값이 있는지 확인한다.
@RestController
public class ArrayListAndHashMapController {
private static final int N = 10_000_000; // 요소 개수
private final List<Integer> arrayList = new ArrayList<>();
private final Map<Integer, String> hashMap = new HashMap<>();
public ArrayListAndHashMapController() {
// ArrayList 초기화
for (int i = 0; i < N; i++) {
arrayList.add(i);
}
// HashMap 초기화
for (int i = 0; i < N; i++) {
hashMap.put(i, "Value" + i);
}
}
// 시간복잡도 : O(n)
@GetMapping("/arraylist")
public String arrayListPerformance(@RequestParam Integer target) {
long startTime = System.currentTimeMillis();
Integer result = arrayList.stream()
.filter(value -> value.equals(target))
.findFirst()
.orElse(null);
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
return "ArrayList Lookup Time: " + elapsedTime + " ms, Founded: " + result;
}
// 시간복잡도 : O(1)
@GetMapping("/hashmap")
public String hashMapPerformance(@RequestParam Integer target) {
long startTime = System.currentTimeMillis();
String value = hashMap.get(target);
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
return "HashMap Lookup Time: " + elapsedTime + " ms, Founded: " + value;
}
}
파라미터의 값을 낮게하면 지연시간이 크지 않다.
100만을 넣으니 지연시간이 크게 올라갔다.
이제 해시맵을 확인해보자
9백만을 했을 떄 1백만보다 더 빠르게 작업이 끝났다. 미미한 차이지만 지연시간이 늘어나지 않는다는 것이 중요 포인트다.
9백만을 했을 떄 1백만보다 더 빠르게 작업이 끝났다.
-->성능 테스트 역시 물리적인 자원을 쓰기 때문에 애플리케이션 성능을 제대로 측정하기 어렵다.
같은 컴퓨터위에서 쓰면 간섭이 생긴다.
--> 서버에 애플리케이션을 배포해둔 상태에서 하는 게 좋다.