[JS] 함수형 프로그래밍 입문 #5
본 강좌는 유인동님의 함수형 프로그래밍과 JavaScript ES6+ 강좌를 듣고 정리한 것입니다. 개인 학습용으로 유료 강좌 내용 전부가 아닌 유인동님의 깃허브에 공개된 자료를 바탕으로 코드를 요약 정리했습니다.
함수형 프로그래밍 입문 #5
range
// 이렇게 하고 싶다
log(range(5));
// [0, 1, 2, 3, 4]
log(range(2));
// [0, 1]
const range = l => {
let i = -1;
let res = [];
while(++i < l) {
res.push(i);
}
return res;
}
// range 함수로 배열을 만들고 배열의 모든 값을 더하려면
const add = (a, b) => a + b;
const list = range(4);
log(List); // 배열 반환
log(reduce(add, list)); // 6 (0 + 1 + 2 + 3)
느긋한 L.range
range의 배열 대신 iterable을 반환하는 iterator 생성
const L = {};
L.range = function *(l) => {
let i = -1;
while(++i < l) {
yield i;
}
}
const list = L.range(4);
log(list); // L.range{<suspended>} 로 이터레이터 반환
log(reduce(add, list)); // 6 (0 + 1 + 2 + 3)
range와의 차이
-
range의 경우 값이 즉시 배열로 평가됨
-
L.range의 경우 값이 즉시 평가되지 않고 지연 평가됨 (iterator니까.)
-
reduce를 만난 후에야 비로소 iterator가 순회되면서 값이 평가됨 (reduce될 때 next 수행)
-
배열 안의 값을 조작하는 것이 최종 목표이므로, 꼭 값이 바로 평가될 필요는 없다는 아이디어.
성능 차이
function test(name, time, f) {
console.time(name);
while(time--) f();
console.timeEnd(name);
}
test('range', 10, () => reduce(add, range(1000000))); // 488ms
test('L.range', 10, () => reduce(add, range(1000000))); // 296ms
-
값을 바로 평가하지 않고 필요할 때만 평가하므로, L.range가 1.5~1.7배 정도 성능이 우수하다.
-
지연 평가를 사용하는 명확한 이유 중의 하나를 찾았다!
Date: August 23, 2019
Tags:
JS