지연 평가(Lazy evaluation)

sangyong·2023년 6월 6일
0

웹개발

목록 보기
3/4

지연 평가(Lazy evaluation)

컴퓨터 프로그래밍에서 느긋한 계산법(Lazy evaluation)은 계산의 결과 값이 필요할 때까지 계산을 늦추는 기법이다. - wikipedia

지연 평가를 사용할 때는 3가지 이점이 있다.
1. 불필요한 계산을 하지 않으므로 빠른 계산이 가능하다.
2. 무한 자료 구조를 사용 할 수 있다.
3. 복잡한 수식에서 오류 상태를 피할 수 있다.
위에서 1번을 위주로 알아보려 한다.

지연 평가의 동작방식

지연 평가와 반대되는 말은 엄격한 평가(strict evaluation)로 js와 java에서 Lambda의 기본 작동방식으로 순차적으로 전 과정이 다 끝나야 다음 과정으로 넘어가는 작동방식이다.

const arr = [0, 1, 2, 3, 4, 5]
const result = arr.map(num => num + 10).filter(num => num % 2).slice(0, 2)
console.log(result) // [11, 13]

위와 같을 때 작동 횟수는 map 6번, filter 6번, slice 2번으로 총 14번의 연산 후 결과가 나오게 됩니다.

이것을 지연 평가 방식으로 바꾸게 되면 엄격한 평가 방식과는 순서를 반대로 작성해야한다.

const arr = [0, 1, 2, 3, 4, 5]
const result = _.take(2,
  L.filter(num => num % 2,
    L.map(num => num + 10, arr)))
console.log(result) // [11, 13]

이렇게 되고 작동 횟수는 map 4번, filter 4번, take 2번으로 총 10번으로 결과가 나오게 됩니다.

지연 평가 활용 함수 만들기

// 지연 평가 함수 모음
const L = {}

L.map = function* (f, iter) {
  for (let item of iter) {
    yield f(item)
  }
}

L.filter = function* (f, iter) {
  for (let item of iter) {
    if(f(item)) yield item
  }
}

L.take = function* (limit, iter) {
  for (let item of iter) {
    yield item
    if (!--limit) break
  }
}

// 엄격한 평가 함수 모음
const _ = {}

_.take = function(limit, iter) {
  const result = []
  for (let item of iter) {
    result.push(item)
    if (result.length === limit) return result
  }
}

참조 : https://armadillo-dev.github.io/javascript/whit-is-lazy-evaluation/

0개의 댓글