🛠️ 처음부터 만드는 Memoize — 함수 결과를 캐싱해서 성능 올리기
같은 인자로 함수를 여러 번 호출하면 매번 계산을 반복합니다. 특히 피보나치, 재귀 함수, 복잡한 연산일수록 성능이 나빠집니다.
Memoize는 함수의 실행 결과를 기억했다가, 같은 인자가 들어오면 캐시된 결과를 즉시 반환합니다.
```javascript
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (key in cache) {
return cache[key];
}
const result = fn.apply(this, args);
cache[key] = result;
return result;
};
}
```
```javascript
// 무거운 계산 함수
const fibonacci = (n) => {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
};
// Memoize 적용
const memoFib = memoize(fibonacci);
console.time('일반');
fibonacci(40); // 약 1초
console.timeEnd('일반');
console.time('Memoize');
memoFib(40); // 약 0.001초
console.timeEnd('Memoize');
```
메모리 누수 방지: 캐시가 계속 쌓이지 않도록 WeakMap을 사용하거나, 캐시 크기 제한을 두세요.
```javascript
function memoizeWithLimit(fn, limit = 100) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn.apply(this, args);
cache.set(key, result);
if (cache.size > limit) {
cache.delete(cache.keys().next().value);
}
return result;
};
}
```
참고: Lodash [`_.memoize`](https://lodash.com/docs/#memoize), 공식 JS 패턴 학습: [MDN Memoization](https://developer.mozilla.org/en-US/docs/Glossary/Memoization)
면접에서 "성능 최적화 경험"이 나오면 memoize를 먼저 생각하세요!
Memoize는 함수의 실행 결과를 기억했다가, 같은 인자가 들어오면 캐시된 결과를 즉시 반환합니다.
기본 구현
```javascript
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (key in cache) {
return cache[key];
}
const result = fn.apply(this, args);
cache[key] = result;
return result;
};
}
```
실제 사용 예제
```javascript
// 무거운 계산 함수
const fibonacci = (n) => {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
};
// Memoize 적용
const memoFib = memoize(fibonacci);
console.time('일반');
fibonacci(40); // 약 1초
console.timeEnd('일반');
console.time('Memoize');
memoFib(40); // 약 0.001초
console.timeEnd('Memoize');
```
실무 팁
메모리 누수 방지: 캐시가 계속 쌓이지 않도록 WeakMap을 사용하거나, 캐시 크기 제한을 두세요.
```javascript
function memoizeWithLimit(fn, limit = 100) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn.apply(this, args);
cache.set(key, result);
if (cache.size > limit) {
cache.delete(cache.keys().next().value);
}
return result;
};
}
```
참고: Lodash [`_.memoize`](https://lodash.com/docs/#memoize), 공식 JS 패턴 학습: [MDN Memoization](https://developer.mozilla.org/en-US/docs/Glossary/Memoization)
면접에서 "성능 최적화 경험"이 나오면 memoize를 먼저 생각하세요!
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!