JavaScript - 병렬 평가

Code_Alpacat·2022년 6월 11일
0

JavaScript - 중급

목록 보기
11/11

*비동기 프로그래밍(4)

1) 지연된 함수열을 병렬적으로 평가하기 - C.reduce, C.take

  • 현재는 싱글스레드의 특성상 한 작업이 끝나면 다음 작업으로 넘어가는 식으로 작업한다. 하지만 한꺼번에 병렬적으로 연산하면 부하는 커지지만 훨씬 빠른 속도로 처리할 수 있다.
  const C = {};

  function noop() {
  }

  const catchNoop = ([...arr]) =>
    (arr.forEach(a => a instanceof Promise ? a.catch(noop) : a), arr);

  C.reduce = curry((f, acc, iter) => iter ?
    reduce(f, acc, catchNoop(iter)) :
    reduce(f, catchNoop(acc)));

  C.take = curry((l, iter) => take(l, catchNoop(iter)));

  C.takeAll = C.take(Infinity);

  C.map = curry(pipe(L.map, C.takeAll));

  C.filter = curry(pipe(L.filter, C.takeAll));

  const delay1000 = a => new Promise(resolve => {
    console.log('hi~');
    setTimeout(() => resolve(a), 1000);
  });

    go([1, 2, 3, 4, 5, 6, 7, 8, 9],
      L.map(a => delay1000(a * a)),
      L.filter(a => delay1000(a % 2)),
      L.map(a => delay1000(a * a)),
      // C.take(2),
      C.reduce(add),
      log,
      _ => console.timeEnd(''));
  • 기존의 reduce는 배열의 하나씩 꺼내서 acc에 더해주는 식으로 연산했다면, C.reduce는 배열의 모든 값을 한꺼번에 출발시켜 병렬적으로 동시에 연산한다.
profile
In the future, I'm never gonna regret, cuz I've been trying my best for every single moment.

0개의 댓글