Muscardinus
Writing Optimized Code 본문
What is JS Engine?
저번 시간에 우리는 JS Engine의 구동원리에 대해서 배웠다. 그리고 마무리하면서 더 빠르고 최적화된 JS Engine의 작동을 돕기 위해서 우리 자신 또한 Optimized Code를 작성해야한다고 하였다. 그렇다면 그 방법에는 어떠한 것이 있을까?
우선 해당 항목들의 사용을 자제하는 것을 추천한다.
- eval()
- arguments -> arguments를 직접으로 사용하는 것을 피하고, arguments.length와 arguments[i]의 형식으로 사용하자
- for in문 -> 차라리 Object.key()를 사용하자
- with
- delete
자 그러면 이제 시작해보자!
Inline Caching
function findUser(user) {
return `found ${user.firstName} ${user.lastName}`;
}
findUser(userData);
const userData = {
firstName: "Brittney",
lastName: "Postman",
};
// if this findUser(userData) is called multiple times,
// then it will be optimized (inline cached) to just be 'found Brittney Postman'
Inline Caching은 Compiler가 자동적으로 수행하는 기능 중 하나이다. 만약 findUser(userData) 함수가 1억 번 반복적으로 실행된다면, Compiler는 userData객체를 1억 번 찾는 것이 아닌, "found Brittney Postman"로 함수를 대체하여 실행 속도를 대폭 향상시킨다.
Hidden Classes
function Animal(x, y) {
this.x = x;
this.y = y;
}
const obj1 = new Animal(1, 2);
const obj2 = new Animal(3, 4);
obj1.a = 30;
obj1.b = 100;
obj2.b = 30;
obj2.a = 100;
대부분의 사람들을 위 코드를 보면서 딱히 문제가 될 것이 없다고 할 것이다. 그렇다. 실행하는 데에는 아무 문제가 없다.
Hidden Classes는 Compiler가 내부적으로 활용하는 기능 중 하나이다. obj1과 obj2를 선언할 때 Compiler는 두 객체가 동일한 hidden Classes를 공유한다고 생각한다. 하지만, 그 이후, obj1과 obj2 객체의 값을 다른 순서로 부여함으로서 Compiler가 헷가려하여, 두 객체가 동일한 Class를 공유한다고 인지하지 않게 되면서 최적화에 문제를 유발 할 수 있다. 또한, delete를 사용하는 것을 조심하라는 이유 또한, hidden Class를 변경한다고 생각하면 된다. 따라서, 최적화를 위해서는 다음과 같이 코드를 변경하는 것이 좋다.
// more optimized version of the code.
function Animal(x, y) {
this.a = x;
this.b = y;
}
const obj1 = new Animal(1, 2);
const obj2 = new Animal(3, 4);
obj1.a = 30;
obj1.b = 100;
obj2.a = 30;
obj2.b = 100;
'FrontEnd > JavaScript Basics' 카테고리의 다른 글
Modules in JS (1) | 2020.12.14 |
---|---|
Call Stack And Memory Heap (0) | 2020.11.30 |
What is JavaScript Engine? (1) | 2020.11.30 |
this keyword - 마지막 (0) | 2020.10.19 |
this keyword - 3탄 (0) | 2020.10.15 |