V8μ μΆμΈ‘ μ΅μ ν κΈ°μ , JavaScript μ€νμ μμΈ‘νκ³ ν₯μμν€λ λ°©λ², κ·Έλ¦¬κ³ μ±λ₯μ λ―ΈμΉλ μν₯μ νꡬν©λλ€. V8μ΄ μ΅λ μλλ₯Ό μν΄ ν¨κ³Όμ μΌλ‘ μ΅μ νν μ μλ μ½λ μμ±λ²μ λ°°μ보μΈμ.
JavaScript V8 μΆμΈ‘ μ΅μ ν: μμΈ‘ μ½λ ν₯μμ λν μ¬μΈ΅ λΆμ
μΉμ ꡬλνλ μΈμ΄μΈ JavaScriptλ μ€ν νκ²½μ μ±λ₯μ ν¬κ² μμ‘΄ν©λλ€. Chrome λ° Node.jsμμ μ¬μ©λλ Googleμ V8 μμ§μ μ΄ λΆμΌμ μ λ μ£Όμλ‘μ, λΉ λ₯΄κ³ ν¨μ¨μ μΈ JavaScript μ€νμ μν΄ μ κ΅ν μ΅μ ν κΈ°μ μ μ¬μ©ν©λλ€. V8μ μ±λ₯ λΉκ²° μ€ κ°μ₯ μ€μν μΈ‘λ©΄ μ€ νλλ μΆμΈ‘ μ΅μ ν(speculative optimization)μ μ¬μ©μ λλ€. μ΄ λΈλ‘κ·Έ κ²μλ¬Όμμλ V8 λ΄μ μΆμΈ‘ μ΅μ νκ° μ΄λ»κ² μλνλμ§, κ·Έ μ΄μ μ 무μμ΄λ©°, κ°λ°μκ° μ΄λ₯Ό νμ©ν μ μλ μ½λλ₯Ό μμ±νλ λ°©λ²μ μμΈν λ€λ£¨λ©° ν¬κ΄μ μΌλ‘ νꡬν©λλ€.
μΆμΈ‘ μ΅μ νλ 무μμΈκ°?
μΆμΈ‘ μ΅μ νλ μ»΄νμΌλ¬κ° μ½λμ λ°νμ λμμ λν΄ κ°μ μ νλ μ΅μ ν μ νμ λλ€. μ΄λ¬ν κ°μ μ κ΄μ°°λ ν¨ν΄κ³Ό ν΄λ¦¬μ€ν±μ κΈ°λ°μΌλ‘ ν©λλ€. κ°μ μ΄ μ¬μ€λ‘ νλͺ λλ©΄ μ΅μ νλ μ½λλ ν¨μ¬ λ λΉ λ₯΄κ² μ€νλ μ μμ΅λλ€. κ·Έλ¬λ κ°μ μ΄ μλ°λλ©΄(μμ΅μ ν), μμ§μ λ μ΅μ νλ λ²μ μ μ½λλ‘ λλμκ°μΌ νλ―λ‘ μ±λ₯ μ νκ° λ°μν©λλ€.
μ΄λ λ§μΉ μ리μ¬κ° λ μνΌμ λ€μ λ¨κ³λ₯Ό μμνκ³ μ¬λ£λ₯Ό 미리 μ€λΉνλ κ²κ³Ό κ°μ΅λλ€. μμν λ¨κ³κ° λ§μΌλ©΄ μ리 κ³Όμ μ΄ λ ν¨μ¨μ μ΄ λ©λλ€. νμ§λ§ μ리μ¬κ° μλͺ» μμνλ©΄, λλμκ°μ λ€μ μμν΄μΌ νλ―λ‘ μκ°κ³Ό μμμ λλΉνκ² λ©λλ€.
V8μ μ΅μ ν νμ΄νλΌμΈ: Crankshaftμ Turbofan
V8μ μΆμΈ‘ μ΅μ νλ₯Ό μ΄ν΄νκΈ° μν΄μλ μ΅μ ν νμ΄νλΌμΈμ μ¬λ¬ κ³μΈ΅μ λν΄ μλ κ²μ΄ μ€μν©λλ€. V8μ μ ν΅μ μΌλ‘ Crankshaftμ Turbofanμ΄λΌλ λ κ°μ§ μ£Όμ μ΅μ ν μ»΄νμΌλ¬λ₯Ό μ¬μ©νμ΅λλ€. Crankshaftλ μ¬μ ν μ‘΄μ¬νμ§λ§, νμ¬ μ΅μ V8 λ²μ μμλ Turbofanμ΄ μ£Όμ μ΅μ ν μ»΄νμΌλ¬μ λλ€. μ΄ κ²μλ¬Όμ μ£Όλ‘ Turbofanμ μ΄μ μ λ§μΆμ§λ§ Crankshaftμ λν΄μλ κ°λ΅νκ² λ€λ£° κ²μ λλ€.
Crankshaft
Crankshaftλ V8μ ꡬν μ΅μ ν μ»΄νμΌλ¬μμ΅λλ€. λ€μκ³Ό κ°μ κΈ°μ μ μ¬μ©νμ΅λλ€:
- νλ ν΄λμ€(Hidden Classes): V8μ κ°μ²΄μ ꡬ쑰(μμ±μ μμμ νμ )μ λ°λΌ "νλ ν΄λμ€"λ₯Ό ν λΉν©λλ€. κ°μ²΄λ€μ΄ λμΌν νλ ν΄λμ€λ₯Ό κ°μ§ λ V8μ μμ± μ κ·Όμ μ΅μ νν μ μμ΅λλ€.
- μΈλΌμΈ μΊμ±(Inline Caching): Crankshaftλ μμ± μ‘°ν κ²°κ³Όλ₯Ό μΊμν©λλ€. λμΌν νλ ν΄λμ€λ₯Ό κ°μ§ κ°μ²΄μμ λμΌν μμ±μ μ κ·Όνλ©΄ V8μ μΊμλ κ°μ μ μνκ² κ²μν μ μμ΅λλ€.
- μμ΅μ ν(Deoptimization): μ»΄νμΌ μ€μ λ§λ€μ΄μ§ κ°μ (μ: νλ ν΄λμ€ λ³κ²½)μ΄ μ¬μ€μ΄ μλ κ²μΌλ‘ νλͺ λλ©΄, Crankshaftλ μ½λλ₯Ό μμ΅μ ννκ³ λ λλ¦° μΈν°ν리ν°λ‘ λ체ν©λλ€.
Turbofan
Turbofanμ V8μ μ΅μ μ΅μ ν μ»΄νμΌλ¬μ λλ€. Crankshaftλ³΄λ€ λ μ μ°νκ³ ν¨μ¨μ μ λλ€. Turbofanμ μ£Όμ νΉμ§μ λ€μκ³Ό κ°μ΅λλ€:
- μ€κ° νν(Intermediate Representation, IR): Turbofanμ λ 곡격μ μΈ μ΅μ νλ₯Ό κ°λ₯νκ² νλ λ μ κ΅ν μ€κ° ννμ μ¬μ©ν©λλ€.
- νμ νΌλλ°±(Type Feedback): Turbofanμ λ°νμμ λ³μμ νμ κ³Ό ν¨μμ λμμ λν μ 보λ₯Ό μμ§νκΈ° μν΄ νμ νΌλλ°±μ μμ‘΄ν©λλ€. μ΄ μ 보λ μ 보μ μ κ°ν μ΅μ ν κ²°μ μ λ΄λ¦¬λ λ° μ¬μ©λ©λλ€.
- μΆμΈ‘ μ΅μ ν(Speculative Optimization): Turbofanμ λ³μμ νμ κ³Ό ν¨μμ λμμ λν΄ κ°μ μ ν©λλ€. μ΄λ¬ν κ°μ μ΄ μ¬μ€μΌ κ²½μ°, μ΅μ νλ μ½λλ ν¨μ¬ λ λΉ λ₯΄κ² μ€νλ μ μμ΅λλ€. κ°μ μ΄ μλ°λλ©΄, Turbofanμ μ½λλ₯Ό μμ΅μ ννκ³ λ μ΅μ νλ λ²μ μΌλ‘ λ체ν©λλ€.
V8(Turbofan)μμ μΆμΈ‘ μ΅μ νκ° μλνλ λ°©μ
Turbofanμ μΆμΈ‘ μ΅μ νλ₯Ό μν΄ μ¬λ¬ κΈ°μ μ μ¬μ©ν©λλ€. μ£Όμ λ¨κ³λ λ€μκ³Ό κ°μ΅λλ€:
- νλ‘νμΌλ§ λ° νμ νΌλλ°±: V8μ JavaScript μ½λμ μ€νμ λͺ¨λν°λ§νλ©° λ³μμ νμ κ³Ό ν¨μμ λμμ λν μ 보λ₯Ό μμ§ν©λλ€. μ΄λ₯Ό νμ νΌλλ°±μ΄λΌκ³ ν©λλ€. μλ₯Ό λ€μ΄, ν¨μκ° μ¬λ¬ λ² μ μ μΈμλ‘ νΈμΆλλ©΄ V8μ νμ μ μ μΈμλ‘ νΈμΆλ κ²μ΄λΌκ³ μΆμΈ‘ν μ μμ΅λλ€.
- κ°μ μμ±: νμ νΌλλ°±μ κΈ°λ°μΌλ‘ Turbofanμ μ½λμ λμμ λν κ°μ μ μμ±ν©λλ€. μλ₯Ό λ€μ΄, λ³μκ° νμ μ μμΌ κ²μ΄λΌκ³ κ°μ νκ±°λ, ν¨μκ° νμ νΉμ νμ μ λ°νν κ²μ΄λΌκ³ κ°μ ν μ μμ΅λλ€.
- μ΅μ νλ μ½λ μμ±: Turbofanμ μμ±λ κ°μ μ κΈ°λ°μΌλ‘ μ΅μ νλ κΈ°κ³ μ½λλ₯Ό μμ±ν©λλ€. μ΄ μ΅μ νλ μ½λλ μ’ μ’ μ΅μ νλμ§ μμ μ½λλ³΄λ€ ν¨μ¬ λΉ λ¦ λλ€. μλ₯Ό λ€μ΄, Turbofanμ΄ λ³μκ° νμ μ μλΌκ³ κ°μ νλ©΄, λ³μμ νμ μ νμΈνμ§ μκ³ μ§μ μ μ μ°μ°μ μννλ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
- κ°λ μ½μ : Turbofanμ λ°νμμ κ°μ μ΄ μ¬μ ν μ ν¨νμ§ νμΈνκΈ° μν΄ μ΅μ νλ μ½λμ κ°λ(guard)λ₯Ό μ½μ ν©λλ€. μ΄ κ°λλ€μ λ³μμ νμ μ΄λ ν¨μμ λμμ νμΈνλ μμ μ½λ μ‘°κ°μ λλ€.
- μμ΅μ ν: κ°λκ° μ€ν¨νλ©΄, κ°μ μ€ νλκ° μλ°λμμμ μλ―Έν©λλ€. μ΄ κ²½μ° Turbofanμ μ½λλ₯Ό μμ΅μ ννκ³ λ μ΅μ νλ λ²μ μΌλ‘ λ체ν©λλ€. μμ΅μ νλ μ΅μ νλ μ½λλ₯Ό λ²λ¦¬κ³ ν¨μλ₯Ό λ€μ μ»΄νμΌν΄μΌ νλ―λ‘ λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€.
μμ: λ§μ μ μΆμΈ‘ μ΅μ ν
λ€μ JavaScript ν¨μλ₯Ό κ³ λ €ν΄ λ³΄μΈμ:
function add(x, y) {
return x + y;
}
add(1, 2); // μ μλ‘ μ΄κΈ° νΈμΆ
add(3, 4);
add(5, 6);
V8μ `add` ν¨μκ° μ¬λ¬ λ² μ μ μΈμλ‘ νΈμΆλλ κ²μ κ΄μ°°ν©λλ€. `x`μ `y`κ° νμ μ μμΌ κ²μ΄λΌκ³ μΆμΈ‘ν©λλ€. μ΄ κ°μ μ λ°νμΌλ‘ Turbofanμ `x`μ `y`μ νμ μ νμΈνμ§ μκ³ μ§μ μ μ λ§μ μ μννλ μ΅μ νλ κΈ°κ³ μ½λλ₯Ό μμ±ν©λλ€. λν λ§μ μ μννκΈ° μ μ `x`μ `y`κ° μ€μ λ‘ μ μμΈμ§ νμΈνλ κ°λλ₯Ό μ½μ ν©λλ€.
μ΄μ ν¨μκ° λ¬Έμμ΄ μΈμλ‘ νΈμΆλλ©΄ μ΄λ»κ² λλμ§ μκ°ν΄ 보μΈμ:
add("hello", "world"); // λμ€μ λ¬Έμμ΄λ‘ νΈμΆ
`x`μ `y`κ° λ μ΄μ μ μκ° μλκΈ° λλ¬Έμ κ°λκ° μ€ν¨ν©λλ€. Turbofanμ μ½λλ₯Ό μμ΅μ ννκ³ λ¬Έμμ΄μ μ²λ¦¬ν μ μλ λ μ΅μ νλ λ²μ μΌλ‘ λ체ν©λλ€. λ μ΅μ νλ λ²μ μ λ§μ μ μννκΈ° μ μ `x`μ `y`μ νμ μ νμΈνκ³ , λ¬Έμμ΄μΈ κ²½μ° λ¬Έμμ΄ μ°κ²°μ μνν©λλ€.
μΆμΈ‘ μ΅μ νμ μ΄μ
μΆμΈ‘ μ΅μ νλ μ¬λ¬ κ°μ§ μ΄μ μ μ 곡ν©λλ€:
- μ±λ₯ ν₯μ: κ°μ μ νκ³ μ΅μ νλ μ½λλ₯Ό μμ±ν¨μΌλ‘μ¨, μΆμΈ‘ μ΅μ νλ JavaScript μ½λμ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
- λμ μ μ: V8μ λ°νμμ λ³ννλ μ½λ λμμ μ μν μ μμ΅λλ€. μ»΄νμΌ μ€μ λ§λ€μ΄μ§ κ°μ μ΄ μ ν¨νμ§ μκ² λλ©΄, μμ§μ μ½λλ₯Ό μμ΅μ ννκ³ μλ‘μ΄ λμμ κΈ°λ°νμ¬ λ€μ μ΅μ νν μ μμ΅λλ€.
- μ€λ²ν€λ κ°μ: λΆνμν νμ κ²μ¬λ₯Ό νΌν¨μΌλ‘μ¨, μΆμΈ‘ μ΅μ νλ JavaScript μ€νμ μ€λ²ν€λλ₯Ό μ€μΌ μ μμ΅λλ€.
μΆμΈ‘ μ΅μ νμ λ¨μ
μΆμΈ‘ μ΅μ νμλ λͺ κ°μ§ λ¨μ λ μμ΅λλ€:
- μμ΅μ ν μ€λ²ν€λ: μμ΅μ νλ μ΅μ νλ μ½λλ₯Ό λ²λ¦¬κ³ ν¨μλ₯Ό λ€μ μ»΄νμΌν΄μΌ νλ―λ‘ λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€. λΉλ²ν μμ΅μ νλ μΆμΈ‘ μ΅μ νμ μ±λ₯ μ΄μ μ μμν μ μμ΅λλ€.
- μ½λ 볡μ‘μ±: μΆμΈ‘ μ΅μ νλ V8 μμ§μ 볡μ‘μ±μ λν©λλ€. μ΄λ¬ν 볡μ‘μ±μ λλ²κΉ λ° μ μ§λ³΄μλ₯Ό λ μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€.
- μμΈ‘ λΆκ°λ₯ν μ±λ₯: μΆμΈ‘ μ΅μ νλ‘ μΈν΄ JavaScript μ½λμ μ±λ₯μ΄ μμΈ‘ λΆκ°λ₯ν μ μμ΅λλ€. μ½λμ μμ λ³κ²½μ΄ λλ‘λ μλΉν μ±λ₯ μ°¨μ΄λ₯Ό μ΄λν μ μμ΅λλ€.
V8μ΄ ν¨κ³Όμ μΌλ‘ μ΅μ νν μ μλ μ½λ μμ±νκΈ°
κ°λ°μλ νΉμ κ°μ΄λλΌμΈμ λ°λ₯΄λ©΄ μΆμΈ‘ μ΅μ νμ λ μ ν©ν μ½λλ₯Ό μμ±ν μ μμ΅λλ€:
- μΌκ΄λ νμ μ¬μ©: λ³μμ νμ μ λ³κ²½νμ§ λ§μΈμ. μλ₯Ό λ€μ΄, λ³μλ₯Ό μ μλ‘ μ΄κΈ°νν ν λμ€μ λ¬Έμμ΄μ ν λΉνμ§ λ§μΈμ.
- λ€νμ± νΌνκΈ°: λ€μν νμ μ μΈμλ₯Ό κ°μ§ ν¨μ μ¬μ©μ νΌνμΈμ. κ°λ₯νλ€λ©΄, λ€λ₯Έ νμ μ λν΄ λ³λμ ν¨μλ₯Ό λ§λμΈμ.
- μμ±μμμ μμ± μ΄κΈ°ν: κ°μ²΄μ λͺ¨λ μμ±μ΄ μμ±μμμ μ΄κΈ°νλλλ‘ νμΈμ. μ΄λ V8μ΄ μΌκ΄λ νλ ν΄λμ€λ₯Ό λ§λλ λ° λμμ΄ λ©λλ€.
- μ격 λͺ¨λ(Strict Mode) μ¬μ©: μ격 λͺ¨λλ μ°λ°μ μΈ νμ λ³ν λ° μ΅μ νλ₯Ό λ°©ν΄ν μ μλ λ€λ₯Έ λμμ λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
- μ½λ λ²€μΉλ§νΉ: λ²€μΉλ§νΉ λꡬλ₯Ό μ¬μ©νμ¬ μ½λμ μ±λ₯μ μΈ‘μ νκ³ μ μ¬μ μΈ λ³λͺ© νμμ μλ³νμΈμ.
μ€μ©μ μΈ μμμ λͺ¨λ² μ¬λ‘
μμ 1: νμ νΌλ νΌνκΈ°
λμ μ¬λ‘:
function processData(data) {
let value = 0;
if (typeof data === 'number') {
value = data * 2;
} else if (typeof data === 'string') {
value = data.length;
}
return value;
}
μ΄ μμμμ `value` λ³μλ μ λ ₯μ λ°λΌ μ«μ λλ λ¬Έμμ΄μ΄ λ μ μμ΅λλ€. μ΄λ V8μ΄ ν¨μλ₯Ό μ΅μ ννκΈ° μ΄λ ΅κ² λ§λλλ€.
μ’μ μ¬λ‘:
function processNumber(data) {
return data * 2;
}
function processString(data) {
return data.length;
}
function processData(data) {
if (typeof data === 'number') {
return processNumber(data);
} else if (typeof data === 'string') {
return processString(data);
} else {
return 0; // λλ μ€λ₯λ₯Ό μ μ ν μ²λ¦¬
}
}
μ¬κΈ°μλ λ‘μ§μ μ«μμ© ν¨μμ λ¬Έμμ΄μ© ν¨μλ‘ λΆλ¦¬νμ΅λλ€. μ΄λ₯Ό ν΅ν΄ V8μ κ° ν¨μλ₯Ό λ 립μ μΌλ‘ μ΅μ νν μ μμ΅λλ€.
μμ 2: κ°μ²΄ μμ± μ΄κΈ°ν
λμ μ¬λ‘:
function Point(x) {
this.x = x;
}
const point = new Point(10);
point.y = 20; // κ°μ²΄ μμ± ν μμ± μΆκ°
κ°μ²΄κ° μμ±λ ν `y` μμ±μ μΆκ°νλ©΄ νλ ν΄λμ€κ° λ³κ²½λκ³ μμ΅μ νκ° λ°μν μ μμ΅λλ€.
μ’μ μ¬λ‘:
function Point(x, y) {
this.x = x;
this.y = y || 0; // λͺ¨λ μμ±μ μμ±μμμ μ΄κΈ°ν
}
const point = new Point(10, 20);
μμ±μμμ λͺ¨λ μμ±μ μ΄κΈ°ννλ©΄ μΌκ΄λ νλ ν΄λμ€κ° 보μ₯λ©λλ€.
V8 μ΅μ ν λΆμ λꡬ
μ¬λ¬ λꡬλ€μ΄ V8μ΄ μ½λλ₯Ό μ΄λ»κ² μ΅μ ννλμ§ λΆμνλ λ° λμμ μ€ μ μμ΅λλ€:
- Chrome DevTools: Chrome DevToolsλ JavaScript μ½λ νλ‘νμΌλ§, νλ ν΄λμ€ κ²μ¬, μ΅μ ν ν΅κ³ λΆμμ μν λꡬλ₯Ό μ 곡ν©λλ€.
- V8 λ‘κΉ : V8μ μ΅μ ν λ° μμ΅μ ν μ΄λ²€νΈλ₯Ό κΈ°λ‘νλλ‘ κ΅¬μ±ν μ μμ΅λλ€. μ΄λ μμ§μ΄ μ½λλ₯Ό μ΄λ»κ² μ΅μ ννλμ§μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν μ μμ΅λλ€. Node.jsλ₯Ό μ€ννκ±°λ DevToolsλ₯Ό μ° μνμμ Chromeμ μ€νν λ `--trace-opt` λ° `--trace-deopt` νλκ·Έλ₯Ό μ¬μ©νμΈμ.
- Node.js Inspector: Node.jsμ λ΄μ₯ μΈμ€νν°λ₯Ό μ¬μ©νλ©΄ Chrome DevToolsμ μ μ¬ν λ°©μμΌλ‘ μ½λλ₯Ό λλ²κΉ νκ³ νλ‘νμΌλ§ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, Chrome DevToolsλ₯Ό μ¬μ©νμ¬ μ±λ₯ νλ‘νμ κΈ°λ‘ν λ€μ "Bottom-Up" λλ "Call Tree" λ·°λ₯Ό κ²μ¬νμ¬ μ€ν μκ°μ΄ μ€λ 걸리λ ν¨μλ₯Ό μλ³ν μ μμ΅λλ€. λν μμ£Ό μμ΅μ νλλ ν¨μλ₯Ό μ°Ύμ μλ μμ΅λλ€. λ κΉμ΄ νκ³ λ€λ €λ©΄, μμμ μΈκΈν λλ‘ V8μ λ‘κΉ κΈ°λ₯μ νμ±ννκ³ μΆλ ₯μμ μμ΅μ ν μμΈμ λΆμνμΈμ.
JavaScript μ΅μ νλ₯Ό μν μ μμ κ³ λ €μ¬ν
μ μΈκ³ μ¬μ©μλ₯Ό λμμΌλ‘ JavaScript μ½λλ₯Ό μ΅μ νν λ λ€μμ κ³ λ €νμΈμ:
- λ€νΈμν¬ μ§μ° μκ°: λ€νΈμν¬ μ§μ° μκ°μ μΉ μ ν리μΌμ΄μ μ μ±λ₯μ μ€μν μμκ° λ μ μμ΅λλ€. λ€νΈμν¬ μμ² μμ μ μ‘λλ λ°μ΄ν° μμ μ΅μννλλ‘ μ½λλ₯Ό μ΅μ ννμΈμ. μ½λ λΆν λ° μ§μ° λ‘λ©κ³Ό κ°μ κΈ°μ μ κ³ λ €νμΈμ.
- κΈ°κΈ° μ±λ₯: μ μΈκ³ μ¬μ©μλ λ€μν μ±λ₯μ κ°μ§ κ΄λ²μν κΈ°κΈ°μμ μΉμ μ μν©λλ€. μ½λκ° μ μ¬μ κΈ°κΈ°μμλ μ μλνλμ§ νμΈνμΈμ. λ°μν λμμΈ λ° μ μν λ‘λ©κ³Ό κ°μ κΈ°μ μ κ³ λ €νμΈμ.
- κ΅μ ν λ° νμ§ν: μ ν리μΌμ΄μ μ΄ μ¬λ¬ μΈμ΄λ₯Ό μ§μν΄μΌ νλ κ²½μ°, κ΅μ ν λ° νμ§ν κΈ°μ μ μ¬μ©νμ¬ μ½λκ° λ€λ₯Έ λ¬Ένμ μ§μμ μ μν μ μλλ‘ νμΈμ.
- μ κ·Όμ±: μ ν리μΌμ΄μ μ΄ μ₯μ λ₯Ό κ°μ§ μ¬μ©μμκ²λ μ κ·Ό κ°λ₯νλλ‘ λ³΄μ₯νμΈμ. ARIA μμ±μ μ¬μ©νκ³ μ κ·Όμ± κ°μ΄λλΌμΈμ λ°λ₯΄μΈμ.
μμ: λ€νΈμν¬ μλμ λ°λ₯Έ μ μν λ‘λ©
`navigator.connection` APIλ₯Ό μ¬μ©νμ¬ μ¬μ©μμ λ€νΈμν¬ μ°κ²° μ νμ κ°μ§νκ³ κ·Έμ λ°λΌ 리μμ€ λ‘λ©μ μ‘°μ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λλ¦° μ°κ²°μ μ¬μ©νλ μ¬μ©μμκ²λ μ ν΄μλ μ΄λ―Έμ§λ λ μμ JavaScript λ²λ€μ λ‘λν μ μμ΅λλ€.
if (navigator.connection && navigator.connection.effectiveType === 'slow-2g') {
// μ ν΄μλ μ΄λ―Έμ§ λ‘λ
loadLowResImages();
}
V8 μΆμΈ‘ μ΅μ νμ λ―Έλ
V8μ μΆμΈ‘ μ΅μ ν κΈ°μ μ λμμμ΄ μ§ννκ³ μμ΅λλ€. ν₯ν κ°λ°μλ λ€μμ΄ ν¬ν¨λ μ μμ΅λλ€:
- λ μ κ΅ν νμ λΆμ: V8μ λ³μμ νμ μ λν΄ λ μ νν κ°μ μ νκΈ° μν΄ λ λ°μ λ νμ λΆμ κΈ°μ μ μ¬μ©ν μ μμ΅λλ€.
- κ°μ λ μμ΅μ ν μ λ΅: V8μ μμ΅μ νμ μ€λ²ν€λλ₯Ό μ€μ΄κΈ° μν΄ λ ν¨μ¨μ μΈ μμ΅μ ν μ λ΅μ κ°λ°ν μ μμ΅λλ€.
- λ¨Έμ λ¬λκ³Όμ ν΅ν©: V8μ λ¨Έμ λ¬λμ μ¬μ©νμ¬ JavaScript μ½λμ λμμ μμΈ‘νκ³ λ μ 보μ μ κ°ν μ΅μ ν κ²°μ μ λ΄λ¦΄ μ μμ΅λλ€.
κ²°λ‘
μΆμΈ‘ μ΅μ νλ V8μ΄ λΉ λ₯΄κ³ ν¨μ¨μ μΈ JavaScript μ€νμ μ 곡ν μ μκ² νλ κ°λ ₯ν κΈ°μ μ λλ€. μΆμΈ‘ μ΅μ νκ° μ΄λ»κ² μλνλμ§ μ΄ν΄νκ³ μ΅μ ν κ°λ₯ν μ½λλ₯Ό μμ±νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄, κ°λ°μλ JavaScript μ ν리μΌμ΄μ μ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. V8μ΄ κ³μ μ§νν¨μ λ°λΌ, μΆμΈ‘ μ΅μ νλ μΉμ μ±λ₯μ 보μ₯νλ λ° ν¨μ¬ λ μ€μν μν μ ν κ²μ λλ€.
μ±λ₯ μ’μ JavaScriptλ₯Ό μμ±νλ κ²μ λ¨μ§ V8 μ΅μ νμ κ΄ν κ²λ§μ΄ μλμ κΈ°μ΅νμΈμ. μ¬κΈ°μλ μ’μ μ½λ© κ΄ν, ν¨μ¨μ μΈ μκ³ λ¦¬μ¦, 리μμ€ μ¬μ©μ λν μΈμ¬ν μ£Όμλ ν¬ν¨λ©λλ€. V8μ μ΅μ ν κΈ°μ μ λν κΉμ μ΄ν΄μ μΌλ°μ μΈ μ±λ₯ μμΉμ κ²°ν©ν¨μΌλ‘μ¨, μ μΈκ³ μ¬μ©μκ° λΉ λ₯΄κ³ λ°μμ΄ μ’μΌλ©° μ¦κ²κ² μ¬μ©ν μ μλ μΉ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.