측정한 데이터를 시각적으로 표현해보자
측정한 결과를 CSV 형식으로 저장했다. 해당 데이터를 차트로 표현하기 위해 두 가지 전처리 과정을 거치려고 한다.
function main(oldPath, newPath) {
const data = fs.readFileSync(oldPath, "utf8");
fs.writeFileSync(newPath, data.split("\n").map((line) => {
let [a, b, c, d, e, f] = line.split(",");
c = (Math.round(Number(c) * 10) / 10).toString();
d = (Math.round(Number(d) * 10) / 10).toString();
e = Number(e).toFixed(2).toString();
f = Number(f).toFixed(2).toString();
return [a, b, c, d, e, f].join(",");
}).join('\n');, "utf8");
}
전처리 전의 결과
전처리 후의 결과
💡 주의할 점
해당 실험은 100만 단위로 프로퍼티 키 길이를 고정하고 진행했다.
Map의 경우 프로퍼티의 수에 따라 사용하는 메모리의 양이 계단식으로 변한다. 얼마나 자주 접근하고, 얼마나 업데이트나 삭제를 자주하느냐는 거의 영향이 없었다.
사용 메모리는 특정 임계치를 넘냐 안 넘냐가 중요했다. 이는 Map 객체가 가진 버킷의 크기와 관련있다. 버킷의 크기보다 담을 수 있는 프로퍼티의 수가 더 크면 버킷의 크기를 두 배로 키우는 메커니즘이 있다. 이 때문에 Map이 사용하는 메모리 양이 100 ⇒ 200 ⇒ 400 으로 늘어나는 것이다.
왼쪽과 같은 상황은 뭘 의미하는 지 생각해보자. 왜 프로퍼티의 수가 똑같은데 메모리 사용량은 절반일까?
아마도, 해쉬 충돌이 많이 일어난 경우 같다. Map은 해쉬 충돌이 일어날 경우 단방향 링크드 리스트로 다음 노드와 연결하는 작업을 한다.
즉, 해쉬 충돌이 많이 일어나서 버킷의 크기를 넘지않은 경우가 아래 점이고, 넘은 경우가 위 점이다.
마음에 드는 슬라이더 Bar를 만들었다. 😎😎😎😎
구현 방법
1. input의 type = range를 이용함
2. 기본으로 제공되는 input appearance를 off함
3. 후에
background : linear-gradient(to right,
칠할 색 0%,
칠할 색 칠할 퍼센트%,
배경색 칠할 퍼센트%,
배경색 100%
)`; 해서 수행함.
가시성이 상당히 떨어진다. 프로퍼티의 수와 업데이트/삭제 확률이나 접근 확률을 고정해 놓고 2차원 그래프로 보여주는 편이 더 나은 것 같다.