컴퓨터 프로그래밍에서 느긋한 계산법(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/