JaveScript/JaveScript
모던자바스크립트 27, 28장 스터디
알면 알 수록 재밌다!
2023. 11. 27. 22:34
모던자바스크립트 스터디 13일차이다.
27장 배열
28장 Number
오늘은 위 단원들을 공부하고 모르는것을 정리했다.
# 궁금증
희소배열이 연속적인 같은 타입의 요소보다 느리지만 메모리 효율적인 이유가 뭘까?
# 이유
js array(배열)은 인덱스 키와 모든 인덱스 속성보다 크다는 불변성을 충족하는 'length'가 있다.
# 문제점
희소 배열을 정의하는 것이 허용되지 않더라도 정의되지 않은 요소를 배열에 넣을 수 있으므로 기본적으로 희소 배열에서 볼 수 있는 것과 동일한 사용성 문제가 발생하게 된다.
# 예시
[0,undefined,...,undefined,1,undefined] 처럼 데이터를 넣으면
# 결과
[0,...,1,]
하면 더 많은 메모리를 소비하는 배열과 느린 반복을 얻을 수 있다.
희소 배열은 일반적으로 규칙적이고 연속적인 배열보다 느리지만 메모리 효율적인 방식으로 구현된다.
범용 데이터에 사용되는 "연속적인 같은 타입의 배열"은 일반적으로 동일한 크기의 요소로 채워진 연속적인 메모리 블록으로 구현된다.
더 많은 요소를 추가하면 메모리 블록을 계속 채우고 소진되면 새 블록을 할당하게 된다.
재할당이 모든 요소를 새로운 메모리 블록으로 이동하는 것을 의미한다는 점을 고려하면,
상기 메모리는 일반적으로 재할당 가능성을 최소화하기 위해 넉넉하게 할당하게 된다.(마지막 용량에 특정 비율을 곱해서 메모리를 할당함).
따라서 이러한 데이터 구조는 일반적으로 순서/로컬 순회(CPU/캐시에 더 친숙함)에 대해 가장 빠르며, 예측할 수 없는 삽입/삭제(충분히 큰 N의 경우)에 대해 가장 느리고 메모리 오버헤드가 높아지게 된다.
즉, sizeof(elem) * N + extra 미래의 요소를 위한 공간이 추가됨
# 궁금증 2
희소배열이 메모리 효율적인데, 같은 타입의 요소를 연속적으로 위치시키는 것을 추천하는 이유가 뭘까?
# 이유
희소배열은 메모리에 분산된 더 작은 메모리 블록을 함께 '연결'하거나 연속적이고 조밀한 데이터 구조의 '논리적으로 압축된' 형식을 사용하거나 둘 다 이용하게 된다.
두 경우 메모리 소비가 줄어들지만, 배열을 순회하는 작업에서 리소스가 더 들어가게 된다.
따라서 희소배열이 연속적이고 동일한 요소의 배열보다 적은 메모리를 사용해서 효율적이지만,
속도는 훨씬 느리게 된다.(예외를 제외하고)
# 참고