티스토리 뷰

기본적인 JS의 자료구조에 Big-O를 적용해 성능을 평가해본다. 내부에서 어떻게 작동하는 지는 자세히 다루지 않는다. 여기에서 중요한 것은, 배열과 객체를 사용한 코드에서 작업할 때, 얼마나 시간이 걸리는 지 파악하는 것이다.

즉 Big-O의 시간복잡도를 적용한 성능을 알아보자.

객체의 성능 평가

// 예시 객체

let student = {
  name: "yujin",
  favoriteAnimal: "fish",
  favoriteNumbers: [4,4,4]
}
  • 삽입 - O(1)
  • 제거 - O(1)
  • 탐색 - O(N)
  • 접근 - O(1)

객체는 정렬되어 있지 않다. 따라서 값을 삽입하거나, 제거하고 접근할 때는 키나 값을 지정하는 상수값만이 필요하다.

그러나 탐색의 경우에는 어떨까?
탐색이란 무엇일까? 탐색이란. 어떤 특정한 정보가 어떤 값에 있는지 확인하는 것이다.

예를 들어, fish라는 값이 어떤 키에 있는지 확인한다고 가정해보자. 이 때 객체는 정렬되어 있지 않기 때문에 모든 값을 찾아봐야 할 수 있다. 따라서 키-값의 개수 N만큼 시간이 늘어난다.

객체 메서드 성능 평가 

  • Object.keys - O(N)
  • Object.values - O(N)
  • Object.entries - O(N)
  • hasOwnProperty - O(1)

배열의 성능 평가

//예시 배열

let animals = ["cat", "dog", "camel", "horse"];
  • 입력 -  삽입 위치에 의존한다. 
  • 제거 -  제거 위치에 의존한다.
  • 탐색 - O(N)
  • 접근 - O(1)

배열은 대부분 정렬되어 있는 데이터를 위해서 사용한다. 때문에 접근상수 시간으로 가능하고, 탐색은 객체와 같이 O(N)의 성능을 가진다.

입력과 제거를 할 때는 삽입 위치에 따라 걸리는 시간이 달라진다. 예를 들어, 마지막에 값을 입력한다면 상수시간이 걸리겠지만, 처음에 입력하고자 한다면 모든 순서 인덱스를 변화시켜야 하기 때문에 O(N)의 성능을 가진다.

배열 메서드 성능 평가 

  • push - O(1)
  • pop - O(1)
  • shift - O(N)
  • unshift - O(N)
  • concat - O(N)
  • slice - O(N)
  • splice - O(N)
  • sort - O(N * log N) // 비교하고, 엘리먼트를 이동해야하기 때문에 조금 더 복잡한 연산이 된다.
  • forEach/map/filter/reduce - O(N)

결론

  • 객체는 거의 모든 동작을 빠르게 하지만 정렬되어 있지 않다.
  • 배열은 정렬되어 있지만, 시작에 추가하고 제거하는 작업이 끝에 추가하고 제거하는 작업보다 훨씬 느리다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함