์ด๋ฒ ํฌ์คํ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ 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๊ฐ์ ์ ์ ์๋ค.
ํ์ง๋ง ๋ฐํ์์ค์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ ํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํด๋น ๊ธธ์ด์ ๋ํ ์ ์๊ฐ ๋ถ๊ฐ๋ฅ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์ ์ผ๋ก ์ถ๊ฐ๋๋ ํ๋กํผํฐ๋ ์ด๋์ ํ ๋น์ด ๋๊ณ ๊ฐ์ฒด์ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์์๋ณด์!
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 ์ ๋ณด๋ฅผ ์ป๊ฒ ๋๋ค.
์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ์ฒด๋ ๋ชจ๋ ํ๋์ hidden class์ ์ฐ๊ฒฐ๋์ด์๋ค.
- hidden class๋ ๊ฐ ํ๋กํผํฐ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์คํ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ์๋ก์ด ํ๋กํผํฐ๊ฐ ์ถ๊ฐ๋์ ์์๋ ์๋ก์ด hidden class๊ฐ ํ์ฑ๋๊ณ ๋งตํ๋๋ค.
- ๊ฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋๊ฐ ์ด์ ์์ฑํด๋ ํ๋์ hidden class๋ฅผ ๊ณต์ ํ๋ค.
์, ๊ทธ๋ผ ์ด๋ฒ์๋ hidden class์ ํจ๊ป ๊ฐ์ด ์ฌ์ฉ๋๋ inline caching์ ๋ํด์ ์์๋ณด์. ๐
hidden class๋ฅผ ์ด์ฉํ๋ค๊ณ ํ๋๋ผ๋ ๊ฒฐ๊ตญ ํน์ ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ฒ ์ ๊ทผํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค. hidden class์ ๋จผ์ ์ ๊ทผํ์ฌ offset ์ ๋ณด๋ฅผ ๊ฐ์ ธ ์จ ๋ค ,์ป์ offset๋ฅผ ํตํด ์ค์ ํ๋กํผํฐ์ ์ ๊ทผํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์กฐ๊ธ ๋ ํจ์จ์ ์ธ ํ๋กํผํฐ ์ ๊ทผ์ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ๋ hidden class ์ด์ธ์ ์ถ๊ฐ์ ์ผ๋ก inline caching๋ ํจ๊ป ์ฌ์ฉํ๋ค.
inline caching์ด๋ ๋ง๊ทธ๋๋ก hidden class์ offset์ cachingํ๋ ๊ฒ์ ์๋ฏธํ๋ค. offset ๊ฐ์ cachingํด ๋์ผ๋ฉด hidden class์ ๋ํ ์ ๊ทผ์ ์๋ตํ๊ณ ๋ฐ๋ก ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ์ ์๋ค.
๋ฐ๋ผ์, ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ ์งํค๋ ๊ฒ์ด ์ข๋ค.
- ๊ฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ hidden class๋ฅผ ๊ณต์ ํ๋๋ก ํ๊ธฐ ์ํด, ๊ฐ์ ์์๋ก ํ๋กํผํฐ๋ฅผ ์ ์ธํ๋ค.
- ๋๋๋ก์ด๋ฉด ์ด๊ธฐํ ํ ๋ ํ๋กํผํฐ๋ฅผ ๋ชจ๋ ์ ์ธํด ๋๋๋ค. ๋์ ์ผ๋ก ์ถ๊ฐํ๋๊ฒ์ hidden class์ ๋ณํ๋ฅผ ์ด๋ํ๋ฏ๋ก ์ข์ง ์๋ค.
- inline caching์ cache hit์จ์ ๋์ด๊ธฐ ์ํด์๋ ํ๋ฒ๋ง ์คํ๋๋ ์ฌ๋ฌ๊ฐ์ง์ method๋ค์ ์ ์ํ๋๊ฒ ๋ณด๋ค, ๊ฐ์ method๋ฅผ ์ฌ๋ฌ๋ฒ ์คํํ๋๊ฒ์ด ์ข๋ค.