[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

Previous:
⏪ [JS] 함수형 프로그래밍 입문 #4

Next:
[DB] AWS basic & IAM ROLE, POLICY ⏩