[Javascript] Object์˜ ๊ตฌ์กฐ (V8)

[์›๋ณธ ๋งํฌ]

Javascript์—์„œ Object๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ํƒ€์ž…์ด๋‹ค.
๋ชจ๋“  ๊ฐ์ฒด๋“ค์ด Object๋กœ ํ•ธ๋“ค๋ง๋˜๊ณ , Key-Value ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋„ Object๋ฅผ ์“ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ Object๋Š” ๋Œ€์ฒด ๋ฌด์Šจ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง„ ๋…€์„์ผ๊นŒ? ๋ณด์žฅํ•˜๋Š” ์„ฑ๋Šฅ์ด๋‚˜ ์‚ฌ์šฉ๋ฒ•์€ HashMap๊ณผ ๋น„์Šทํ•œ๋ฐ, ์‹ ๊ธฐํ•˜๊ฒŒ๋„ Hashtable์— ๋”ฐ๋ฅด๋Š” ์ œ์•ฝ์ด๋‚˜ ๊ด€๋ฆฌํฌ์ธํŠธ๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

์ผ๋‹จ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ๋ถ€๋ถ„์€, Object์˜ ๊ตฌํ˜„์€ ๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
JS ๋ช…์„ธ๋Š” ์ตœ์†Œํ•œ์˜ ๋™์ž‘ ํ˜•ํƒœ๋งŒ ๋ณด์žฅํ•  ๋ฟ์ด๊ณ , ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•Œ์•„์„œ ํ•˜๋ผ๋Š” ์ฃผ์˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. "ํ•ด์‹œํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ" ๋™์ž‘ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์–ธ์–ด ๋””์ž์ธ์ด ๊ฐœ๋–ก๊ฐ™๋‹ค๋ณด๋‹ˆ ๋’ท๋‹จ์—์„œ ์ตœ์ ํ™”ํ•œ๋‹ค๊ณ  ๊ณ ์ƒ์ด ๋งŽ๋‹ค.




V8 ๊ณ„์—ด์˜ ๊ฒฝ์šฐ

ํฌ๋กฌ, ์—ฃ์ง€, Node.js ๊ฐ™์€ V8 ์—”์ง„์—์„œ Object์€ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ณ€ํ™˜๋˜๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ง€๋‹Œ๋‹ค.
Object์ด ํ•ด์‹œํ…Œ์ด๋ธ”์ด ์•„๋‹ˆ๋ผ๋Š” ์†Œ๋ฌธ์ด ํผ์ ธ์žˆ๋Š”๋ฐ, ์‚ฌ์‹ค ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋งž๊ธด ํ•˜๋‹ค.

์ผ๋‹จ Object๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ 2๊ฐ€์ง€์˜ ๋ณ€์‹ ๋ชจ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

  1. Fast ๋ชจ๋“œ: ๊ตฌ์กฐ์ฒด์ฒ˜๋Ÿผ ์ตœ์ ํ™”๋จ
  2. 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๊ฐœ ํ•„๋“œ๋กœ ๊ตฌ์„ฑ์ด ๋œ๋‹ค.

  1. hiddenClass๊ฐ€ ์•„๊นŒ ๋งํ–ˆ๋˜ fast ๋ชจ๋“œ์—์„œ์˜ ๊ตฌ์กฐ์ฒด ํ˜•ํƒœ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ–ˆ์—ˆ๋‹ค.
  2. properties๋Š” ์ผ๋ฐ˜์ ์ธ Object ๋ฐ์ดํ„ฐ์ผ๋•Œ ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๊ณ ,
  3. 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