지연평가

devjune·2021년 10월 4일

ES5

목록 보기
14/14

평가란 무엇인가.
함수에서의 평가는 함수를 수행해서 결과를 구한다이고, 즉, 함수의 평가란 변수를 주어진 숫자 또는 표현식으로 대체하는 것을 의미한다.
ex)
f(x) = 2x + 4 함수를 , x = 5로 평가한다면, x에 주어진 5를 대입한다.
f(5) = 2*5 + 4 = 14
f(5) = 14

평가에는 엄격한 평가와 지연 평가가 있다.

/* 엄격한 평가 */

var mi = 0;
var fi = 0;

_.go(
    _.range(100) //0~인자값이 들어있는 배열을 리턴,
    _.map(function(val) {
        ++mi; // 100번 루프
        return val * val;
    }),
    _.filter(function(val) {
        ++fi; // 100번 루프
        return val % 2;
    }),
    _.take(5), // 5개 꺼내기
    console.log
);

console.log(mi, fi); // 100 100

/* 지연 평가로 성능 높이기 */
/* take(5) 에서 5개를 가져오는데 필요한만큼만 루프를 돈다 */
/* 하나를 제곱하면 바로 다음 필터에 넣어보고, true로 평가되면 take에 넣어서 하나를 축적, 5개가 축적될 때 까지 반복한다 */

var mi = 0;
var fi = 0;

_.go(
    _.range(100),
    L.map(function(val) {
        ++mi; // 10번 루프
        return val * val;
    }),
    L.filter(function(val) {
        ++fi; // 10번 루프
        return val % 2;
    }),
    L.take(5),
    console.log
);
console.log(mi, fi); // 10 10

엄격한 평가

val1val2val3val4val5val6
map->->->->->->
filter->->x->x->
map->->->->
reject->->x->
takeO(1개)O(2개)->

엄격한 평가는, 말 그대로 순서에 맞게 엄격하게 평가한다.
map에서 각각을 모두 평가하여 val ~ val6을 평가한다.
다음 filter, map, reject에서도 마찬가지로 모두 평가한 뒤, take(2)에서 2개를 평가하고 끝낸다.

지연 평가

val1val2val3val4val5val6
map
filterx
mapv
rejectx
takeO(1개)O(2개)

엄격한 평가는, 말 그대로 순서에 맞게 엄격하게 평가한다.
map에서 각각을 모두 평가하여 val ~ val6을 평가한다.
다음 filter, map, reject에서도 마찬가지로 모두 평가한 뒤, take(2)에서 2개를 평가하고 끝낸다.

partial.js에서 네임스페이스를 _대신 L로 변하면 지연평가가 되며, 나머지 연산은 실행되지 않도록 알아서 최적화를 해준다.
이는 map, filter 등이 순수함수이기 때문에 가능하다.
평가 시점이나 평가 순서와 상관없이 동일한 결과를 가져올 수 있기 때문이다.

profile
개발자준

0개의 댓글