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

 

희소배열이 메모리 효율적인데, 같은 타입의 요소를 연속적으로 위치시키는 것을 추천하는 이유가 뭘까?


# 이유

 

희소배열은 메모리에 분산된 더 작은 메모리 블록을 함께 '연결'하거나 연속적이고 조밀한 데이터 구조의 '논리적으로 압축된' 형식을 사용하거나 둘 다 이용하게 된다.

두 경우 메모리 소비가 줄어들지만, 배열을 순회하는 작업에서 리소스가 더 들어가게 된다.

 

따라서 희소배열이 연속적이고 동일한 요소의 배열보다 적은 메모리를 사용해서 효율적이지만,

속도는 훨씬 느리게 된다.(예외를 제외하고)


# 참고

 

https://stackoverflow.com/questions/46526520/why-are-we-allowed-to-create-sparse-arrays-in-javascript