lazy evaluation이 왜 빠른지 궁금할 때 보면 좋을 만한 자료가 있다.
참조
http://filimanjaro.com/blog/2014/introducing-lazy-evaluation/
strict evaluation(eagerly evalution)의 방법은 한 단계씩 차례차례 진행한다고 할 수 있다.
![](http://filimanjaro.com/blog/wp-content/uploads/2014/11/lodash-naive.gif)
lazy evaluation은 한 번에 처리를 한다는 개념(마치 chunk 배치) 으로 보면 된다.
![](http://filimanjaro.com/blog/wp-content/uploads/2014/11/grafika.gif)
따라서 대부분의 경우는 이렇게 성능이 좋다.!!
![](http://filimanjaro.com/blog/wp-content/uploads/2014/11/benchmark.jpg)
전체적으로 lazy 방식이 성능이 좋다.
하지만, 항상(무조건) 빠르다고 보장할 수는 없다. 대충 비슷할 수도 있기 때문에 테스트가 필요하다.
또한, 코드는 복잡해지기 때문에 유지보수성이 떨어질 수 있는 단점이 있다.
view를 이용해 lazy와 eager 계산법으로 만든 예시를 소개한다.
val list = List(0, 1, 2, 3, 4, 5)
// eager evaluation : 조급한 계산법 (위키)
val evens = list.map(i => {
println(s"$i")
i + 10
}).filter(i => {
i % 2 == 0
}).take(2).foreach(println)
println("-------")
// view를 이용한 lazy evaluation : 느긋한 계산법 (위키)
val evensView = list.view.map(i => {
println(s"$i")
i + 30
}).filter(i => {
i % 2 == 0
}).take(2).foreach(println)
첫 번째 stream(eager)에 대한 결과는 다음과 같다.
0
1
2
3
4
5
10
12
두 번째 stream(view를 사용한 lazy) 결과는 다음과 같다.
0
30
1
2
32
첫 번째 stream은 list의 모든 엘리먼트를 조사하고 결과를 내지만,
두 번째 stream은 정확하게 필요한 내용만 조사하기 때문에 속도가 빠르다.
'scribbling' 카테고리의 다른 글
[펌] 마르코프 체인 (0) | 2016.10.20 |
---|---|
[스크랩] 다양한 관점의 멘탈 모델(mental model)과 인지 부하 (cognitive load) (0) | 2016.10.14 |
[사례 공유] Jenkins, Docker, Rspec를 이용한 빠른 Spec by Example 공유 - Deview 2016 발표 탈락 (0) | 2016.10.06 |
경계 조건(edge case), 복합 경계 조건(corner case) (0) | 2016.09.27 |
트렌드 - docker cluster management 툴 (Kubernetes 1등 !) (0) | 2016.09.08 |