예전 주제로 게으른 평가를 구현해보는 주제로 포스팅 했던적이 있다. 그것 또한 lodash에 구현되어있는지 테스트 및 사용 법을 포스팅 하고자 한다.
https://sejiwork.blogspot.com/2020/12/1000-2.html
그 당시의 코드를 확인해보면 아래와 같다.
const calcPointList = go(
members,
lazyMap( member => {
const { family, point } = member
return {
...member,
calPoint: family * point
}
} ),
lazyFilter( ( { calPoint } ) => calPoint >= 1000 ),
lazyMap( ( { calPoint } ) => Math.floor( Math.sqrt( calPoint ) ) ),
lazyFilter( calPoint => calPoint % 2 ),
take(2)
)
위에 보면, lazyMap, lazyFilter, lazyMap, lazyFiler, take를 사용 함으로써, members데이터 모두를 map, filter, map, filter, take 순회 하는 것이 아닌, members 데이터 각각을 가지고 lazyMap, lazyFilter, lazyMap, lazyFiler, take 한번씩 돌려보고 데이터가 두개(take(2)) 되는 순간 더 이상 평가를 하지 않아도 되게 처리 되었다.
전에 테스트 했던 방식과 같이 샘플 데이터는 아래와 같은 함수로 처리 하고자 한다.
const genMember = () => {
return {
family: Math.ceil( Math.random() * 8 ),
point: Math.ceil( Math.random() * 8000 )
}
}
const members = _( 1000000 ).range().map( genMember ).value()
위에서 _( 1000000 ).range().map( genMember ).value() 이 코드의 뜻은 0 ~ 999999의 값을 가지고 있는 길이 1000000짜리 배열을 만들고, genMember 함수를 map의 인자로 넣어 형태를 바꾸어 주는 코드라고 알아두면 된다.
위의 데이터를 가지고 아래의 코드를 실행해보자.
console.time()
let res = _.map( members, member => {
const { family, point } = member
return {
...member,
calPoint: family * point
}
} )
res = _.filter( res, ( { calPoint } ) => calPoint >= 1000 )
res = _.map( res, ( { calPoint } ) => Math.floor( Math.sqrt( calPoint ) ) )
res = _.filter( res, calPoint => calPoint % 2 )
res = _.take( res, 2 )
console.timeEnd()
2624.993896484375 ms
2700.028076171875 ms
3191.663818359375 ms
세 차례 실행 해보았을 때 위와같은 시간이 소모 되었다.
그러면 아래의 코드를 실행해보자.
console.time()
_( members )
.map( member => {
const { family, point } = member
return {
...member,
calPoint: family * point
}
} )
.filter( ( { calPoint } ) => calPoint >= 1000 )
.map( ( { calPoint } ) => Math.floor( Math.sqrt( calPoint ) ) )
.filter( calPoint => calPoint % 2 )
.take( 2 )
.value()
console.timeEnd()
0.14697265625 ms
0.18994140625 ms
0.1689453125 ms
세 차례 실행 해보았을때 위와 같은 속도가 차이나는데, 여기서 보면 lodash의 사용방법만 차이가 날 뿐 코드의 순서는 똑같다. 이와 같은 사용 방식을 함수 체이닝 이라고 하며, lodash는 체이닝을 하는 것만으로도 게으른 평가를 지원한다.
댓글
댓글 쓰기