[Javascript] Object์ ๊ตฌ์กฐ (V8)
Javascript์์ Object๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ๊ทผ๊ฐ์ด ๋๋ ํ์
์ด๋ค.
๋ชจ๋ ๊ฐ์ฒด๋ค์ด Object๋ก ํธ๋ค๋ง๋๊ณ , Key-Value ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ Object๋ฅผ ์ด๋ค.
๊ทธ๋ฐ๋ฐ Object๋ ๋์ฒด ๋ฌด์จ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง ๋ ์์ผ๊น? ๋ณด์ฅํ๋ ์ฑ๋ฅ์ด๋ ์ฌ์ฉ๋ฒ์ HashMap๊ณผ ๋น์ทํ๋ฐ, ์ ๊ธฐํ๊ฒ๋ Hashtable์ ๋ฐ๋ฅด๋ ์ ์ฝ์ด๋ ๊ด๋ฆฌํฌ์ธํธ๊ฐ ๋ฐ๋ก ์กด์ฌํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
์ผ๋จ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๋ถ๋ถ์, Object์ ๊ตฌํ์ ๋ธ๋ผ์ฐ์ ์์ง๋ง๋ค ๋ค๋ฅด๋ค๋ ๊ฒ์ด๋ค.
JS ๋ช
์ธ๋ ์ต์ํ์ ๋์ ํํ๋ง ๋ณด์ฅํ ๋ฟ์ด๊ณ , ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ์ ์์์ ํ๋ผ๋ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ด๋ค. "ํด์ํ
์ด๋ธ์ฒ๋ผ" ๋์ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ธ์ด ๋์์ธ์ด ๊ฐ๋ก๊ฐ๋ค๋ณด๋ ๋ท๋จ์์ ์ต์ ํํ๋ค๊ณ ๊ณ ์์ด ๋ง๋ค.
V8 ๊ณ์ด์ ๊ฒฝ์ฐ
ํฌ๋กฌ, ์ฃ์ง, Node.js ๊ฐ์ V8 ์์ง์์ Object์ ์ํ์ ๋ฐ๋ผ ๋ณํ๋๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ง๋๋ค.
Object์ด ํด์ํ
์ด๋ธ์ด ์๋๋ผ๋ ์๋ฌธ์ด ํผ์ ธ์๋๋ฐ, ์ฌ์ค ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํด์ํ
์ด๋ธ์ ์ฌ์ฉํ๋๊ฒ ๋ง๊ธด ํ๋ค.
์ผ๋จ Object๋ ์ํฉ์ ๋ฐ๋ผ 2๊ฐ์ง์ ๋ณ์ ๋ชจ๋๋ฅผ ๊ฐ์ง๋ค.
- Fast ๋ชจ๋: ๊ตฌ์กฐ์ฒด์ฒ๋ผ ์ต์ ํ๋จ
- Dictionary ๋ชจ๋: ํด์๋งต์ผ๋ก ๋์ (๋๋ฆผ)
์ฒ์์ ํค์ ๊ฐ์ด ๊ฑฐ์ ๊ณ ์ ๋ ํํ๋ก ์์ฑ๋๋ฉด V8 ์์ง์ ์ด๊ฑธ ๊ฑฐ์ C์ ๊ตฌ์กฐ์ฒด ๊ฐ์ฒ๋ผ ์ฒ๋ฆฌํ๋ค. ์ด ํ์
์ Hidden class๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด ์ํ๋ฅผ Fast ๋ชจ๋๋ผ ํ๊ณ , ์ด๋๋ ๋งค์ฐ ๋น ๋ฅด๋ค.
์๋ก์ด ํค๊ฐ ์ถ๊ฐ๋๋ฉด ๋ค์ ์๋ก์ด Hidden class๋ฅผ ์์ฑํด์ ๋์ํ๋ค.
ํ์ง๋ง fast ๋ชจ๋์์ ๊ฐ๋นํ๊ธฐ ์ด๋ ค์ด ๋์ ํจํด์ด ์์๋๋ฉด Dictionary ๋ชจ๋๋ก ๋ณํ๋ค. ๊ทธ๋ฆฌ๊ณ ํด์ํ
์ด๋ธ์ฒ๋ผ ๋์ํ๋ค.
๋์
๋๋ฆฌ ๋ชจ๋๋ fast ๋ชจ๋๋ณด๋ค ๋๋ฆฌ๊ณ ์ต์ ํ๋ ์ ๋ง๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์์ผ๋ ค๊ณ ํ๋ค. ๋ณดํต ์์๋ฅผ ์ญ์ ํ๊ฑฐ๋ ํ๋ ๊ตฌ์กฐํ๊ฐ ์ด๋ ค์ด ํํ์ ์ก์
์ ์ํํ๋ฉด ๋์
๋๋ฆฌ ๋ชจ๋๋ก ์ ํ์ด ๋๋ค. ํค-๊ฐ์์ด ๊ณผ๋ํ๊ฒ ๋ง์ ๋๋ ๊ทธ๋ฐ๋ค.
var user = { name: 'connor', sex: 'male' };
// fast mode๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋จ
delete user.sex;
// dictionary mode๋ก ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋จ
์กฐ๊ธ๋ง ๋ ์์ธํ๊ฒ ์ดํด๋ณด์
์ผ๋จ Object ์์ฒด์๋ hiddenClass, properties, elements์ 3๊ฐ ํ๋๋ก ๊ตฌ์ฑ์ด ๋๋ค.
- hiddenClass๊ฐ ์๊น ๋งํ๋ fast ๋ชจ๋์์์ ๊ตฌ์กฐ์ฒด ํํ๋ฅผ ์ ์ํ๋ ๊ฒ์ด๋ผ๊ณ ํ์๋ค.
- properties๋ ์ผ๋ฐ์ ์ธ Object ๋ฐ์ดํฐ์ผ๋ ํค-๊ฐ ์์ ์ ์ฅํ๋ ์์ญ์ด๊ณ ,
- elements๋ ๋ฐฐ์ด์ผ๋์ ๊ฐ์ ์ ์ฅํ๋ ์์ญ์ด๋ค. ๊ทธ๋์ ๋ฐฐ์ด์ ์ฌ์ค Object๋ค. ๋ฐฐ์ด์ ๋์๋ฒ์ ๋ํด์๋ ๋ฐ๋ก ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ๋ค. ๊ฝค ๋ณต์กํ ํธ์ด๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ๋น Object์์ ์์ํด์ ํ๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด HiddenClass๋ฅผ ๊ณ์ํด์ ์ฆ์ ๊ฐฑ์ ํ๋ค.
์ฌ์ค ๋ค ์ธํฐํ๋ฆฌํ
์ธ์ด๋ผ์ ๊ฐ๋ฅํ ์ง์ด๋ค.
์ฌ๊ธฐ์ ์ฌ๋ฏธ์๋ ๋ถ๋ถ์, HiddenClasses๋ ๊ฐ์ ๊ท์๋ ๊ฒ์ด ์๋๋ผ ์ ์ญ์์ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ๋๋ ํ์
์ ๋ณด๋ผ๋ ๊ฒ์ด๋ค.

๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ์์, ๊ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๊ฐ 2๊ฐ ์ด์ ์กด์ฌํ๋ค๋ฉด
const foo = {
a: 1,
b: 3,
}
const bar = {
a: 4,
b: 4444,
}
์ foo์ bar๋ ๊ฐ์ HiddenClass๋ฅผ ๊ณต์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ HiddenClass๋ก ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก ํค ๋ชฉ๋ก์ด ๊ต์ฅํ ๋ง์์ง๊ฑฐ๋ ๋ณต์กํด์ง๋ฉด dictionary ๋ชจ๋๋ก ์ ํ๋๋ค. dictionary ๋ชจ๋๋ ๋ช ๋ฐฑํ๊ฒ ํด์ํ ์ด๋ธ๋ก ๋์ํ๋๊ฒ ๋ง๋ค.
https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/hash-table-inl.h;l=39?q=ComputeCapacity&ss=chromium
์ค์ v8 ์ฝ๋ ๋ณด๋ฉด ๋์จ๋ค.
๊ทธ๋์ dictionary ๋ชจ๋์ผ ๋๋ ์ผ๋ฐ์ ์ธ ํด์ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ด์ฆ๊ฐ ์ปค์ง๋๋ง๋ค 2๋ฐฐ์ growing์ ๊ฑฐ์น๋ ๋ฑ, ๋ถํ ํฌ์ธํธ๊ฐ ์ข ์กด์ฌํ๋ค.
ํด์์ถฉ๋์ด๋ ์ฌํ ๋น์ ์ต์ํํ๊ธฐ ์ํด 50%์ ์ฌ์ ๊ณต๊ฐ์ ๋๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
dictionary์ ๋ํ ์ง์ ์ ์ธ capacity ์ค์ ์ด ์ ๊ณต๋์ง ์๋๊ฑด ์์ฌ์ด ๋ถ๋ถ์ด๋ค.
์ฐธ์กฐ
https://v8.dev/blog/elements-kinds
https://stackoverflow.com/questions/50011721/if-v8-rehashes-when-an-object-grows
https://stackoverflow.com/questions/50044338/how-v8-stores-fast-objects
https://v8.dev/blog/fast-properties?m=1
https://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html