V8์ ํผ๋๋ฐฑ ๋ฒกํฐ ์ต์ ํ๋ฅผ ์ฌ์ธต ๋ถ์ํฉ๋๋ค. ์์ฑ ์ ๊ทผ ํจํด ํ์ต, ํ๋ ํด๋์ค, ์ธ๋ผ์ธ ์บ์๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์๋๋ฅผ ๊ทน์ ์ผ๋ก ํฅ์์ํค๋ ์๋ฆฌ์ ์ค์ฉ์ ์ธ ์ต์ ํ ์ ๋ต์ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ V8 ํผ๋๋ฐฑ ๋ฒกํฐ ์ต์ ํ: ์์ฑ ์ ๊ทผ ํจํด ํ์ต ์ฌ์ธต ๋ถ์
ํฌ๋กฌ๊ณผ Node.js์ ์ฌ์ฅ์ธ V8 ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฐ์ด๋ ์ฑ๋ฅ์ผ๋ก ์ ๋ช ํฉ๋๋ค. ์ด ์ฑ๋ฅ์ ํต์ฌ ์์๋ ์ ๊ตํ ์ต์ ํ ํ์ดํ๋ผ์ธ์ด๋ฉฐ, ์ด๋ ํผ๋๋ฐฑ ๋ฒกํฐ(feedback vectors)์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ์ด ๋ฒกํฐ๋ค์ V8์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋ฐํ์ ๋์์ ํ์ตํ๊ณ ์ ์ํ๋ ๋ฅ๋ ฅ์ ํต์ฌ์ผ๋ก, ํนํ ์์ฑ ์ ๊ทผ์์ ์๋นํ ์๋ ํฅ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ๊ธ์์๋ V8์ด ์ธ๋ผ์ธ ์บ์ฑ๊ณผ ํ๋ ํด๋์ค๋ฅผ ํ์ฉํ์ฌ ํผ๋๋ฐฑ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด ์์ฑ ์ ๊ทผ ํจํด์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
ํต์ฌ ๊ฐ๋ ์ดํดํ๊ธฐ
ํผ๋๋ฐฑ ๋ฒกํฐ๋ ๋ฌด์์ธ๊ฐ?
ํผ๋๋ฐฑ ๋ฒกํฐ๋ V8์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์ํํ๋ ์์ ์ ๋ํ ๋ฐํ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ์ด ์ ๋ณด์๋ ์กฐ์๋๋ ๊ฐ์ฒด์ ์ ํ, ์ ๊ทผํ๋ ์์ฑ, ๋ค์ํ ์์ ์ ๋น๋ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. V8์ด ์ค์๊ฐ์ผ๋ก ์ฝ๋์ ๋์์ ๊ด์ฐฐํ๊ณ ํ์ตํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก, ํผ๋๋ฐฑ ๋ฒกํฐ๋ ํน์ ๋ฐ์ดํธ์ฝ๋(bytecode) ๋ช ๋ น์ด์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ฐ ๋ช ๋ น์ด๋ ํผ๋๋ฐฑ ๋ฒกํฐ์ ์ฌ๋ฌ ์ฌ๋กฏ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ฐ ์ฌ๋กฏ์ ํด๋น ํน์ ๋ช ๋ น์ด์ ์คํ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
ํ๋ ํด๋์ค: ํจ์จ์ ์ธ ์์ฑ ์ ๊ทผ์ ๊ธฐ๋ฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ํ์ ์ธ์ด๋ก, ๋ณ์์ ํ์ ์ด ๋ฐํ์ ์ค์ ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์์ง์ด ์ปดํ์ผ ํ์์ ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ต์ ํ์ ์ด๋ ค์์ ์ค๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด V8์ ํ๋ ํด๋์ค(hidden classes)(๋๋ก๋ ๋งต(maps) ๋๋ ์ ฐ์ดํ(shapes)๋ผ๊ณ ๋ ํจ)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๋ ํด๋์ค๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ(์์ฑ ๋ฐ ์คํ์ )๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋๋ง๋ค V8์ ํ๋ ํด๋์ค๋ฅผ ํ ๋นํฉ๋๋ค. ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ์์๋ก ๋์ผํ ์์ฑ ์ด๋ฆ์ ๊ฐ์ง๋ฉด ๋์ผํ ํ๋ ํด๋์ค๋ฅผ ๊ณต์ ํ๊ฒ ๋ฉ๋๋ค.
๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์๊ฐํด ๋ณด์ธ์:
const obj1 = { x: 10, y: 20 };
const obj2 = { x: 5, y: 15 };
obj1๊ณผ obj2๋ ๋์ผํ ์์๋ก ๋์ผํ ์์ฑ์ ๊ฐ์ง๋ฏ๋ก ์๋ง๋ ๋์ผํ ํ๋ ํด๋์ค๋ฅผ ๊ณต์ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์์ฑ ํ obj1์ ์์ฑ์ ์ถ๊ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
obj1.z = 30;
์ด์ obj1์ ์๋ก์ด ํ๋ ํด๋์ค๋ก ์ ํ๋ฉ๋๋ค. V8์ด ๊ฐ์ฒด ๊ตฌ์กฐ์ ๋ํ ์ดํด๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก ์ด ์ ํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ธ๋ผ์ธ ์บ์(IC): ์์ฑ ์กฐํ ์๋ ํฅ์
์ธ๋ผ์ธ ์บ์(IC, Inline caches)๋ ํ๋ ํด๋์ค๋ฅผ ํ์ฉํ์ฌ ์์ฑ ์ ๊ทผ ์๋๋ฅผ ๋์ด๋ ํต์ฌ ์ต์ ํ ๊ธฐ์ ์ ๋๋ค. V8์ ์์ฑ ์ ๊ทผ์ ๋ง์ฃผ์ณค์ ๋, ๋๋ฆฐ ๋ฒ์ฉ ์กฐํ๋ฅผ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ๋์ , ๊ฐ์ฒด์ ์ฐ๊ด๋ ํ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ค์ง ์คํ์ ์์ ์ง์ ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ฑ์ ์ฒ์ ์ ๊ทผํ ๋ IC๋ ์ด๊ธฐํ๋์ง ์์(uninitialized) ์ํ์ ๋๋ค. V8์ ์์ฑ ์กฐํ๋ฅผ ์ํํ๊ณ ํ๋ ํด๋์ค์ ์คํ์ ์ IC์ ์ ์ฅํฉ๋๋ค. ์ดํ ๋์ผํ ํ๋ ํด๋์ค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ ๋์ผํ ์์ฑ์ ์ ๊ทผํ ๋๋ ์บ์๋ ์คํ์ ์ ์ฌ์ฉํ์ฌ ๋น์ฉ์ด ๋ง์ด ๋๋ ์กฐํ ๊ณผ์ ์ ํผํ ์ ์์ต๋๋ค. ์ด๋ ์์ฒญ๋ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
๊ฐ๋จํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฒซ ์ ๊ทผ: V8์ด
obj.x๋ฅผ ๋ง๋ฉ๋๋ค. IC๋ ์ด๊ธฐํ๋์ง ์์์ต๋๋ค. - ์กฐํ: V8์ด
obj์ ํ๋ ํด๋์ค์์x์ ์คํ์ ์ ์ฐพ์ต๋๋ค. - ์บ์ฑ: V8์ด ํ๋ ํด๋์ค์ ์คํ์ ์ IC์ ์ ์ฅํฉ๋๋ค.
- ์ดํ ์ ๊ทผ: ๋ง์ฝ
obj(๋๋ ๋ค๋ฅธ ๊ฐ์ฒด)๊ฐ ๋์ผํ ํ๋ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, V8์ ์บ์๋ ์คํ์ ์ ์ฌ์ฉํ์ฌx์ ์ง์ ์ ๊ทผํฉ๋๋ค.
ํผ๋๋ฐฑ ๋ฒกํฐ์ ํ๋ ํด๋์ค์ ์ํธ ์์ฉ ๋ฐฉ์
ํผ๋๋ฐฑ ๋ฒกํฐ๋ ํ๋ ํด๋์ค์ ์ธ๋ผ์ธ ์บ์ ๊ด๋ฆฌ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์์ฑ ์ ๊ทผ ์ค์ ๊ด์ฐฐ๋ ํ๋ ํด๋์ค๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ์ด ์ ๋ณด๋ ๋ค์ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค:
- ํ๋ ํด๋์ค ์ ํ ์ ๋ฐ: V8์ด ๊ฐ์ฒด ๊ตฌ์กฐ์ ๋ณ๊ฒฝ(์: ์ ์์ฑ ์ถ๊ฐ)์ ๊ด์ฐฐํ๋ฉด ํผ๋๋ฐฑ ๋ฒกํฐ๋ ์๋ก์ด ํ๋ ํด๋์ค๋ก์ ์ ํ์ ์์ํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- IC ์ต์ ํ: ํผ๋๋ฐฑ ๋ฒกํฐ๋ ํน์ ์์ฑ ์ ๊ทผ์ ๋ํด ์ฃผ๋ก ์ฌ์ฉ๋๋ ํ๋ ํด๋์ค์ ๋ํ ์ ๋ณด๋ฅผ IC ์์คํ ์ ์๋ฆฝ๋๋ค. ์ด๋ฅผ ํตํด V8์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ํด IC๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ฝ๋ ์ต์ ํ ํด์ : ๋ง์ฝ ๊ด์ฐฐ๋ ํ๋ ํด๋์ค๊ฐ IC๊ฐ ์์ํ๋ ๊ฒ๊ณผ ํฌ๊ฒ ๋ฒ์ด๋๋ฉด, V8์ ์ฝ๋๋ฅผ ์ต์ ํ ํด์ (deoptimize)ํ๊ณ ๋ ๋๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ ์์ฑ ์กฐํ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋๋์๊ฐ ์ ์์ต๋๋ค. ์ด๋ IC๊ฐ ๋ ์ด์ ํจ๊ณผ์ ์ด์ง ์๊ณ ์คํ๋ ค ํด๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ ์๋๋ฆฌ์ค: ๋์ ์ผ๋ก ์์ฑ ์ถ๊ฐํ๊ธฐ
์ด์ ์์ ๋ฅผ ๋ค์ ์ดํด๋ณด๋ฉฐ ํผ๋๋ฐฑ ๋ฒกํฐ๊ฐ ์ด๋ป๊ฒ ๊ด์ฌํ๋์ง ์์๋ด ์๋ค:
function Point(x, y) {
this.x = x;
this.y = y;
}
const p1 = new Point(10, 20);
const p2 = new Point(5, 15);
// Access properties
console.log(p1.x + p1.y);
console.log(p2.x + p2.y);
// Now, add a property to p1
p1.z = 30;
// Access properties again
console.log(p1.x + p1.y + p1.z);
console.log(p2.x + p2.y);
๋ด๋ถ์ ์ผ๋ก ์ผ์ด๋๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ด๊ธฐ ํ๋ ํด๋์ค:
p1๊ณผp2๊ฐ ์์ฑ๋ ๋, ์ด๋ค์ ๋์ผํ ์ด๊ธฐ ํ๋ ํด๋์ค(x์y๋ฅผ ํฌํจ)๋ฅผ ๊ณต์ ํฉ๋๋ค. - ์์ฑ ์ ๊ทผ (์ฒซ ๋ฒ์งธ):
p1.x์p1.y์ ์ฒ์ ์ ๊ทผํ ๋, ํด๋น ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด์ ํผ๋๋ฐฑ ๋ฒกํฐ๋ ๋น์ด ์์ต๋๋ค. V8์ ์์ฑ ์กฐํ๋ฅผ ์ํํ๊ณ ํ๋ ํด๋์ค์ ์คํ์ ์ผ๋ก IC๋ฅผ ์ฑ์๋๋ค. - ์์ฑ ์ ๊ทผ (์ดํ):
p2.x์p2.y์ ๋ ๋ฒ์งธ๋ก ์ ๊ทผํ ๋, IC๊ฐ ์ ์คํ์ฌ ์์ฑ ์ ๊ทผ์ด ํจ์ฌ ๋นจ๋ผ์ง๋๋ค. - ์์ฑ
z์ถ๊ฐ:p1.z๋ฅผ ์ถ๊ฐํ๋ฉดp1์ด ์๋ก์ด ํ๋ ํด๋์ค๋ก ์ ํ๋ฉ๋๋ค. ์์ฑ ํ ๋น ์์ ๊ณผ ๊ด๋ จ๋ ํผ๋๋ฐฑ ๋ฒกํฐ๊ฐ ์ด ๋ณ๊ฒฝ์ ๊ธฐ๋กํฉ๋๋ค. - ์ต์ ํ ํด์ (์ ์ฌ์ ):
p1.z๋ฅผ ์ถ๊ฐํ *ํ*์p1.x์p1.y์ ๋ค์ ์ ๊ทผํ๋ฉด, IC๊ฐ ๋ฌดํจํ๋ ์ ์์ต๋๋ค(V8์ ํด๋ฆฌ์คํฑ์ ๋ฐ๋ผ ๋ค๋ฆ). ์ด๋p1์ ํ๋ ํด๋์ค๊ฐ ์ด์ IC๊ฐ ์์ํ๋ ๊ฒ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ ๊ฐ๋จํ ๊ฒฝ์ฐ, V8์ ์ด์ ํ๋ ํด๋์ค์ ์ ํ๋ ํด๋์ค๋ฅผ ์ฐ๊ฒฐํ๋ ์ ํ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ด๋ ์ ๋์ ์ต์ ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์์๋ ์ต์ ํ ํด์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. - ์ต์ ํ (๊ฒฐ๊ณผ์ ์ผ๋ก): ์๊ฐ์ด ์ง๋๋ฉด์
p1์ด ์๋ก์ด ํ๋ ํด๋์ค๋ก ์์ฃผ ์ ๊ทผ๋๋ฉด, V8์ ์๋ก์ด ์ ๊ทผ ํจํด์ ํ์ตํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ๋ฉฐ, ์ ๋ฐ์ดํธ๋ ํ๋ ํด๋์ค์ ํนํ๋ ์๋ก์ด IC๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์ต์ ํ ์ ๋ต
V8์ด ์์ฑ ์ ๊ทผ ํจํด์ ์ด๋ป๊ฒ ์ต์ ํํ๋์ง ์ดํดํ๋ฉด ๋ ์ฑ๋ฅ ์ข์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์ ๋ต์ ๋๋ค:
1. ์์ฑ์์์ ๋ชจ๋ ๊ฐ์ฒด ์์ฑ ์ด๊ธฐํํ๊ธฐ
ํญ์ ์์ฑ์๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ ๋ชจ๋ ๊ฐ์ฒด ์์ฑ์ ์ด๊ธฐํํ์ฌ ๋์ผํ "ํ์ "์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ํ๋ ํด๋์ค๋ฅผ ๊ฐ๋๋ก ํ์ธ์. ์ด๋ ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์ฝ๋์์ ์ค์ํฉ๋๋ค.
// ๋์ ์: ์์ฑ์ ๋ฐ์์ ์์ฑ ์ถ๊ฐํ๊ธฐ
function BadPoint(x, y) {
this.x = x;
this.y = y;
}
const badPoint = new BadPoint(1, 2);
badPoint.z = 3; // ์ด๋ ๊ฒ ํ์ง ๋ง์ธ์!
// ์ข์ ์: ์์ฑ์์์ ๋ชจ๋ ์์ฑ ์ด๊ธฐํํ๊ธฐ
function GoodPoint(x, y, z) {
this.x = x;
this.y = y;
this.z = z !== undefined ? z : 0; // ๊ธฐ๋ณธ๊ฐ
}
const goodPoint = new GoodPoint(1, 2, 3);
GoodPoint ์์ฑ์๋ z ๊ฐ์ด ์ ๊ณต๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ GoodPoint ๊ฐ์ฒด๊ฐ ๋์ผํ ์์ฑ์ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค. z๊ฐ ํญ์ ์ฌ์ฉ๋์ง ์๋๋ผ๋, ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ด ๋์ค์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ์ข
์ข
๋ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
2. ๋์ผํ ์์๋ก ์์ฑ ์ถ๊ฐํ๊ธฐ
๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ๋ ์์๋ ํ๋ ํด๋์ค์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํ๋ ํด๋์ค ๊ณต์ ๋ฅผ ๊ทน๋ํํ๋ ค๋ฉด ๋์ผํ "ํ์ "์ ๋ชจ๋ ๊ฐ์ฒด์ ๊ฑธ์ณ ๋์ผํ ์์๋ก ์์ฑ์ ์ถ๊ฐํ์ธ์.
// ์ผ๊ด์ฑ ์๋ ์์ฑ ์์ (๋์จ)
const objA = { a: 1, b: 2 };
const objB = { b: 2, a: 1 }; // ์์๊ฐ ๋ค๋ฆ
// ์ผ๊ด๋ ์์ฑ ์์ (์ข์)
const objC = { a: 1, b: 2 };
const objD = { a: 1, b: 2 }; // ์์๊ฐ ๊ฐ์
objA์ objB๋ ๋์ผํ ์์ฑ์ ๊ฐ์ง๊ณ ์์ง๋ง, ์์ฑ ์์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ๋ ํด๋์ค๋ฅผ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ, ์ด๋ ๋ ํจ์จ์ ์ธ ์์ฑ ์ ๊ทผ์ผ๋ก ์ด์ด์ง๋๋ค.
3. ๋์ ์ผ๋ก ์์ฑ ์ญ์ ํ์ง ์๊ธฐ
๊ฐ์ฒด์์ ์์ฑ์ ์ญ์ ํ๋ฉด ํ๋ ํด๋์ค๊ฐ ๋ฌดํจํ๋์ด V8์ด ๋ ๋๋ฆฐ ์์ฑ ์กฐํ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋๋์๊ฐ๊ฒ ํ ์ ์์ต๋๋ค. ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์์ฑ ์ญ์ ๋ฅผ ํผํ์ธ์.
// ์์ฑ ์ญ์ ํผํ๊ธฐ (๋์จ)
const obj = { a: 1, b: 2, c: 3 };
delete obj.b; // ํผํ์ธ์!
// ๋์ null ๋๋ undefined ์ฌ์ฉ (์ข์)
const obj2 = { a: 1, b: 2, c: 3 };
obj2.b = null; // ๋๋ undefined
์์ฑ์ null์ด๋ undefined๋ก ์ค์ ํ๋ ๊ฒ์ ๊ฐ์ฒด์ ํ๋ ํด๋์ค๋ฅผ ๋ณด์กดํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ญ์ ํ๋ ๊ฒ๋ณด๋ค ์ฑ๋ฅ์ด ๋ ์ข์ต๋๋ค.
4. ์ซ์ ๋ฐ์ดํฐ์ ํ์ ๋ฐฐ์ด ์ฌ์ฉํ๊ธฐ
๋๋์ ์ซ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ํ์
๋ฐฐ์ด(Typed Arrays) ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ํ์
๋ฐฐ์ด์ ํน์ ๋ฐ์ดํฐ ํ์
(์: Int32Array, Float64Array)์ ๋ฐฐ์ด์ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด๋ณด๋ค ๋ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. V8์ ์ข
์ข
ํ์
๋ฐฐ์ด์ ๋ํ ์ฐ์ฐ์ ๋ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค.
// ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด
const arr = [1, 2, 3, 4, 5];
// ํ์
๋ฐฐ์ด (Int32Array)
const typedArr = new Int32Array([1, 2, 3, 4, 5]);
// ์ฐ์ฐ ์ํ (์: ํฉ๊ณ)
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
let typedSum = 0;
for (let i = 0; i < typedArr.length; i++) {
typedSum += typedArr[i];
}
ํ์ ๋ฐฐ์ด์ ์์น ๊ณ์ฐ, ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋๋ ๊ธฐํ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
5. ์ฝ๋ ํ๋กํ์ผ๋งํ๊ธฐ
์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ฝ๋๊ฐ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ์๋นํ๋ ๋ถ๋ถ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ์ด ๊ธ์์ ๋ ผ์๋ ์ต์ ํ ๊ธฐ์ ์ ์ ์ฉํ ์ ์๋ ์์ญ์ ์๋ณํ ์ ์์ต๋๋ค.
- ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ ์ด๊ธฐ: ์น ํ์ด์ง์์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ ํด๋ฆญํ๊ณ "๊ฒ์ฌ"๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ "Performance" ํญ์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๊ธฐ๋ก: ๊ธฐ๋ก ๋ฒํผ์ ํด๋ฆญํ๊ณ ํ๋กํ์ผ๋งํ๋ ค๋ ์์ ์ ์ํํฉ๋๋ค.
- ๋ถ์: ๊ธฐ๋ก์ ์ค์งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํฉ๋๋ค. ์คํํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์ฆ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ ๋ฐํ๋ ํจ์๋ฅผ ์ฐพ์ผ์ธ์.
๊ณ ๊ธ ๊ณ ๋ ค ์ฌํญ
๋คํ์ฑ ์ธ๋ผ์ธ ์บ์
๋๋ก๋ ๋ค๋ฅธ ํ๋ ํด๋์ค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์์ ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ V8์ ๋คํ์ฑ ์ธ๋ผ์ธ ์บ์(PICs, polymorphic inline caches)๋ฅผ ์ฌ์ฉํฉ๋๋ค. PIC๋ ์ฌ๋ฌ ํ๋ ํด๋์ค์ ๋ํ ์ ๋ณด๋ฅผ ์บ์ํ ์ ์์ด ์ ํ๋ ์์ค์ ๋คํ์ฑ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ํ๋ ํด๋์ค์ ์๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด PIC๋ ๋นํจ์จ์ ์ด ๋ ์ ์์ผ๋ฉฐ, V8์ ๋ฉ๊ฐ๋ชจํฝ ์กฐํ(๊ฐ์ฅ ๋๋ฆฐ ๊ฒฝ๋ก)์ ์์กดํ ์ ์์ต๋๋ค.
์ ํ ํธ๋ฆฌ
์์ ์ธ๊ธํ๋ฏ์ด, ๊ฐ์ฒด์ ์์ฑ์ด ์ถ๊ฐ๋๋ฉด V8์ ์ด์ ํ๋ ํด๋์ค์ ์ ํ๋ ํด๋์ค๋ฅผ ์ฐ๊ฒฐํ๋ ์ ํ ํธ๋ฆฌ(transition tree)๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด V8์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ํ๋ ํด๋์ค๋ก ์ ํ๋ ๋๋ ์ด๋ ์ ๋์ ์ต์ ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณผ๋ํ ์ ํ์ ์ฌ์ ํ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ต์ ํ ํด์
V8์ด ์ต์ ํ๊ฐ ๋ ์ด์ ์ ํจํ์ง ์๋ค๊ณ ๊ฐ์งํ๋ฉด(์: ์๊ธฐ์น ์์ ํ๋ ํด๋์ค ๋ณ๊ฒฝ์ผ๋ก ์ธํด), ์ฝ๋๋ฅผ ์ต์ ํ ํด์ (deoptimize)ํ ์ ์์ต๋๋ค. ์ต์ ํ ํด์ ๋ ๋ ๋๋ฆฌ๊ณ ์ผ๋ฐ์ ์ธ ์คํ ๊ฒฝ๋ก๋ก ๋๋์๊ฐ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ต์ ํ ํด์ ๋ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ ๋ฐํ๋ ์ํฉ์ ํผํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ค์ ์ฌ๋ก ๋ฐ ๊ตญ์ ํ ๊ณ ๋ ค ์ฌํญ
์ฌ๊ธฐ์ ๋ ผ์๋ ์ต์ ํ ๊ธฐ์ ์ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ฌ์ฉ์์ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ๋ณดํธ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ํน์ ์ง์ญ์ด๋ ์ฐ์ ์์๋ ํน์ ์ฝ๋ฉ ํจํด์ด ๋ ๋๋ฆฌ ํผ์ ธ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
- ๋ฐ์ดํฐ ์ง์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ (์: ๊ธ์ต ๋ชจ๋ธ๋ง, ๊ณผํ ์๋ฎฌ๋ ์ด์ ): ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ํ์ ๋ฐฐ์ด ์ฌ์ฉ๊ณผ ์ ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ด์ ์ ์ป์ต๋๋ค. ์ธ๋, ๋ฏธ๊ตญ, ์ ๋ฝ ์ ์ญ์ ํ์ด ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ์ฝ๋๋ ๋ง๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ต์ ํ๋์ด์ผ ํฉ๋๋ค.
- ๋์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ง ์น ์ ํ๋ฆฌ์ผ์ด์ (์: ์ ์ ์๊ฑฐ๋ ์ฌ์ดํธ, ์์ ๋ฏธ๋์ด ํ๋ซํผ): ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๋น๋ฒํ ๊ฐ์ฒด ์์ฑ ๋ฐ ์กฐ์์ ํฌํจํฉ๋๋ค. ์์ฑ ์ ๊ทผ ํจํด์ ์ต์ ํํ๋ฉด ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ํฌ๊ฒ ํฅ์์์ผ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ํํ์ ์ค ์ ์์ต๋๋ค. ์ผ๋ณธ์ ์ ์ ์๊ฑฐ๋ ์ฌ์ดํธ์์ ์ดํ๋ฅ ์ ์ค์ด๊ธฐ ์ํด ๋ก๋ฉ ์๊ฐ์ ์ต์ ํํ๋ ๊ฒ์ ์์ํด ๋ณด์ธ์.
- ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ : ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ ์์์ด ์ ํ๋์ด ์์ผ๋ฏ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ๋์ฑ ์ค์ํฉ๋๋ค. ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๊ณ ํ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ๋ฐฐํฐ๋ฆฌ ์๋ชจ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌํ๋ผ ์ด๋จ ์ํ๋ฆฌ์นด์์ ๋ง์ด ์ฌ์ฉ๋๋ ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๊ฐ์ง ์ ์ฌ์ ๊ธฐ๊ธฐ์์๋ ์ฑ๋ฅ์ด ์ข์์ผ ํฉ๋๋ค.
๋ํ, ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n) ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ V8 ์ต์ ํ์๋ ๋ณ๊ฐ์ ๋ฌธ์ ์ด์ง๋ง ๊ฐ์ ์ ์ผ๋ก ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ๋ฌธ์์ด ์กฐ์์ด๋ ๋ ์ง ํ์ ์ง์ ์์ ์ ์ฑ๋ฅ ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ต์ ํ๋ i18n ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ถํ์ํ ์์ ์ ํผํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
V8์ด ์์ฑ ์ ๊ทผ ํจํด์ ์ด๋ป๊ฒ ์ต์ ํํ๋์ง ์ดํดํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์์ฑ์์์ ๊ฐ์ฒด ์์ฑ ์ด๊ธฐํํ๊ธฐ, ๋์ผํ ์์๋ก ์์ฑ ์ถ๊ฐํ๊ธฐ, ๋์ ์์ฑ ์ญ์ ํผํ๊ธฐ ๋ฑ ์ด ๊ธ์์ ์ค๋ช ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด V8์ด ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ด๋ฌํ ๊ธฐ์ ์ ์ ๋ต์ ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ฑ๋ฅ ์ด์ ์ ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ ์์ต๋๋ค. ํจ์จ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ณ ๊ฐ์๊ฒ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
V8์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ต์ ์ต์ ํ ๊ธฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. V8 ๋ธ๋ก๊ทธ ๋ฐ ๊ธฐํ ์๋ฃ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ฐธ์กฐํ์ฌ ๊ธฐ์ ์ ์ต์ ์ํ๋ก ์ ์งํ๊ณ ์ฝ๋๊ฐ ์์ง์ ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํ๊ณ ์๋์ง ํ์ธํ์ธ์.
์ด๋ฌํ ์์น์ ์์ฉํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๋ชจ๋๋ฅผ ์ํ ๋ ๋น ๋ฅด๊ณ , ๋ ํจ์จ์ ์ด๋ฉฐ, ๋ ๋ฐ์์ ์ธ ์น ๊ฒฝํ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.