๐Ÿ“–Hidden Class์™€ inline caching

๊ธฐ๋ก์ผ๊ธฐ๐Ÿ“ซยท2020๋…„ 12์›” 6์ผ
1

Javascript ๊ฐœ๋…์ •๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
3/15

์ด๋ฒˆ ํฌ์ŠคํŒ…์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Hidden Class์™€ inline caching์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์ž! ํ‰์†Œ์— ๊ถ๊ธˆํ–ˆ๋˜ ๋‚ด์šฉ์ด์—ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ์šฐ์—ฐํžˆ ์•Œ๊ฒŒ๋˜์–ด ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์ด ํฌ์ŠคํŒ…์€ https://richardartoul.github.io/jekyll/update/2015/04/26/hidden-classes.html ์„ ์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ ๊ธฐํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.


let person = {
  name: ["Bob", "Smith"],
  age: 32,
  gender: "male",
  interests: ["music", "skiing"],
};

person.hobby = "coding";
console.log(person.hobby); // coding

์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ตฌ๋ณ„๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์˜ ํŠน๋ณ„ํ•œ ๊ฐœ์„ฑ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ด๋ ‡๊ฒŒ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋“ค๋„ ๊ฐ์ฒด์— ๋งตํ•‘์ด ๋ ํ…๋ฐ, ์–ด๋””์— ์ €์žฅ๋˜๋Š”๊ฑธ๊นŒ?

๋˜ ๊ฐ์ฒด๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ์˜ ์œ„์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ๊ธฐ์–ตํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ?


๊ฐ์ฒด ๊ด€๋ฆฌ ๋ฐฉ์‹

Java๋‚˜ C++๊ฐ™์€ ์–ธ์–ด์—์„œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋“ค์€ ์ปดํŒŒ์ผ ์ „์— ๊ฒฐ์ •๋œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์ปดํŒŒ์ผ ์ „์— ์ด๋ฏธ ํ•ด๋‹น Class๋‚˜ ๊ฐ์ฒด๊ฐ€ ๋ช‡ byte๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋ ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ ์ด์œ ๋Š” Java๋‚˜ C++ ๊ฐ™์€ ์ปดํŒŒ์ผ ์–ธ์–ด์—์„œ ๊ฐ์ฒด๋Š” ๋Ÿฐํƒ€์ž„์— ํ”„๋กœํผํ‹ฐ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด์—์„œ ๊ฐ๊ฐ์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ด๋””์— ์œ„์น˜ํ•  ๊ฒƒ์ธ์ง€ ํ˜น์€ ๊ฐ์ฒด๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ํŠน์ • ํ”„๋กœํผํ‹ฐ ์‚ฌ์ด์˜ ๊ณ ์ • offset๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์ค‘์— ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•ด๋‹น ๊ธธ์ด์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ์–ด๋””์— ํ• ๋‹น์ด ๋˜๊ณ  ๊ฐ์ฒด์˜ ๊ด€๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์•Œ์•„๋ณด์ž!

Hidden Class!

V8 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ๋Š” ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์˜ ํšจ๊ณผ์ ์ธ ์ ‘๊ทผ์„ ์œ„ํ•ด hidden class ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ํ•˜๋‚˜์˜ ์ˆจ๊ฒจ์ง„ class๋ฅผ ํ•˜๋‚˜ ๋‘์–ด ๊ฐ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์˜ offset ์ •๋ณด์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ ์ดํ›„ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด hidden class๋ฅผ ๋งŒ๋“ค์–ด ๋งค์น˜ํ•œ๋‹ค.

let obj = {}

์œ„ ์ฒ˜๋Ÿผ ๋นˆ ๊ฐ์ฒด๊ฐ€ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ง€๋ฉด, hidden class C0(๊ฐ€์นญ)์ด ์ƒ์„ฑ๋˜์–ด object๋Š” hidden class์ธ C0์— ๋“ฑ๋ก๋œ๋‹ค.

obj.x = 1;

์ดํ›„ ๋™์ ์œผ๋กœ x๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด, ์ƒˆ๋กœ์šด hidden class์ธ C1์ด ์ƒ์„ฑ๋˜๋ฉฐ ๊ธฐ์กด object๋Š” ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ hidden class์ธ C1๊ณผ ์—ฐ๊ฒฐ๋œ๋‹ค.


๊ธฐ์กด์˜ C0 hidden class๋Š” ์—†์–ด์ง€์ง€ ์•Š๊ณ , ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๋นˆ obj๊ฐ€ ๋งŒ๋“ค์–ด ์ง„๋‹ค๋ฉด, C0๊ณผ ๋งคํ•‘๋˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ C0 hidden class์—๋Š” '๋„ˆ๊ฐ€ ๋งŒ์•ฝ ์ด object์— 'x'๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, C1์œผ๋กœ ๊ฐ€๋ฉด ๋ผ!' ๋ผ๋Š” C1๊ณผ์˜ ๋งตํ•‘ ์ •๋ณด๋„ ์ถ”๊ฐ€๋œ๋‹ค.

obj.y = 2;

์ดํ›„ ์ƒˆ๋กญ๊ฒŒ y๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋์„๋•Œ, ์ƒˆ๋กœ์šด hidden Class์ธ C2๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  object๋Š” C2์™€ ์—ฐ๊ฒฐ๋œ๋‹ค. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ hidden class๋Š” ๊ธฐ์กด์˜ x์— ๋Œ€ํ•œ offset๊ณผ ํ•จ๊ป˜ ์ถ”๊ฐ€๋œ ํ”„๋กœํผํ‹ฐ y์˜ offset์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.


์ด ๋•Œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ C1 hidden class์—๋Š” '๋„ˆ๊ฐ€ ๋งŒ์•ฝ ์ด object์— 'y'๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, C2๋กœ ๊ฐ€๋ฉด ๋ผ!' ๋ผ๋Š” C2๊ณผ์˜ ๋งตํ•‘ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ offset์„ ๊ธฐ์–ต ํ•˜๋Š” ํžˆ๋“  ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค! ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ผ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ํžˆ๋“  ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•ด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ offset ์ •๋ณด๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.

์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ํ•˜๋‚˜์˜ hidden class์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค.
  2. hidden class๋Š” ๊ฐ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜คํ”„์…‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  3. ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋์„ ์‹œ์—๋Š” ์ƒˆ๋กœ์šด hidden class๊ฐ€ ํ˜•์„ฑ๋˜๊ณ  ๋งตํ•‘๋œ๋‹ค.
  4. ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋‘๊ฐœ ์ด์ƒ ์ƒ์„ฑํ•ด๋„ ํ•˜๋‚˜์˜ hidden class๋ฅผ ๊ณต์œ ํ•œ๋‹ค.


Inline Caching

์ž, ๊ทธ๋Ÿผ ์ด๋ฒˆ์—๋Š” hidden class์™€ ํ•จ๊ป˜ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š” inline caching์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. ๐Ÿ˜

hidden class๋ฅผ ์ด์šฉํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๊ฒฐ๊ตญ ํŠน์ • ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋‘๋ฒˆ ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. hidden class์— ๋จผ์ € ์ ‘๊ทผํ•˜์—ฌ offset ์ •๋ณด๋ฅผ ๊ฐ€์ ธ ์˜จ ๋’ค ,์–ป์€ offset๋ฅผ ํ†ตํ•ด ์‹ค์ œ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ธ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ์„ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” hidden class ์ด์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ inline caching๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

inline caching์ด๋ž€ ๋ง๊ทธ๋Œ€๋กœ hidden class์˜ offset์„ cachingํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. offset ๊ฐ’์„ cachingํ•ด ๋†“์œผ๋ฉด hidden class์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ƒ๋žตํ•˜๊ณ  ๋ฐ”๋กœ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.



๊ฒฐ๋ก 

๋”ฐ๋ผ์„œ, ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  1. ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ hidden class๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  2. ๋˜๋„๋ก์ด๋ฉด ์ดˆ๊ธฐํ™” ํ• ๋•Œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋‘ ์„ ์–ธํ•ด ๋†“๋Š”๋‹ค. ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒƒ์€ hidden class์˜ ๋ณ€ํ™”๋ฅผ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ์ข‹์ง€ ์•Š๋‹ค.
  3. inline caching์˜ cache hit์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ method๋“ค์„ ์ •์˜ํ•˜๋Š”๊ฒƒ ๋ณด๋‹ค, ๊ฐ™์€ method๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€