인프런 커뮤니티 질문&답변

boutime2017님의 프로필 이미지
boutime2017

작성한 질문수

함수형 프로그래밍과 JavaScript ES6+ 응용편

reduce 하나 보다 map + filter + reduce

퍼포먼스/가독성

작성

·

250

2

초보적인 질문입니다 ㅠㅠ

1.지연 평가/즉시 평가

예제에서 L.map과 L.filter그리고 reduce를 조합해서 써주셨는데요

이전 강의부터 궁금했던 건데 지연 평가를 한다고 해도, reduce의 경우 takeAll처럼 결국 이터러블/이터레이터를 모두 평가를 해야되기 때문에 지연 평가나 즉시 평가나 시간복잡도/퍼포먼스적인 부분에서 차이가 없는 것이 아닌가 생각되는데 이것이 맞나요? 

제 생각에 지연 평가는 take(작은 수)로 이터러블의 모든 요소를 순회/평가하지 않아도 되는 경우에만 의미가 있는 것 같은데, 뭔가 놓친 부분이 있는 것은 아닌지 궁금합니다

2.reduce only / reduce + map + filter

강의에서 말씀해주신 부분에서만 추측해보자면, 함수 합성으로 하시는 이유가 추상화/재사용성/가독성 등의 이유가 주된 이유인 것 같습니다.

그런데, map, filter, reduce의 조합이면 일단 순회를 3차례 돌아야 하는 것이고, reduce만 쓰면 순회는 1차례에서 끝날 텐데, 혹시 퍼포먼스적인 부분에서는 차이가 없나요?

1번 질문이랑 연결해서 (이터러블의 모든 요소를 순회해야 한다면) 지연 평가를 한다고 해도 평가를 그때 그때 필요한 시점에 하는 것일 뿐, 평가를 덜해도 되는 것이 아니기 때문에 제 생각에는 최종 평가까지 걸리는 시간이 더 들 것 같은데...

(console.time을 찍어봤지만 간단한 예제라서 그런지 실행 시간에는 별 차이를 느끼지 못했습니다...)  

답변 2

5

유인동님의 프로필 이미지
유인동
지식공유자

그리고 전혀 초보적인 질문이 아닙니다. 깊게 생각하시고 공부하고 계신게 느껴집니다. 멋진 개발자가 되실거라 믿어 의심치 않습니다. :)

4

유인동님의 프로필 이미지
유인동
지식공유자

1. 

시간복잡도면에서는 차이가 없습니다. 다만 array를 만들지 않는다는 차이 정도는 있습니다. array의 크기가 클수록 이점이 있을 수 있습니다.

지연 평가의 퍼포먼스 차이가 크게 나는 경우는 결국 take 를 하게 되는 경우입니다. find, some, every 같은 함수 혹은 유사한 로직을 구현할 때 지연평가의 그런 혜택을 받게됩니다. 퍼포먼스가 좋으면서 좋은 표현의 코드를 얻게 됩니다.

평가를 지연하는 성질을 이용하는 것은 단순히 성능만을 위해 사용하는 개념은 아닙니다. 개발자가 사고하는 방식 자체를 살짝 바꿉니다. 퍼포먼스 튜닝을 걱정하지 않으면서 평가를 지연해둘 수 있다는 점은 많은 로직을 편하게 생각하고 쉽게 만들 수 있게 도와줍니다. 

또다른 측면으로는 평가를 지연해두었기 때문에 이후에 동시적으로 평가할 것인지를 선택할 수 있게도 됩니다.  퍼포먼스적인 측면외에도 평가를 지연하는 것으로 얻는 것은 이처럼 여러가지 이점들이 있습니다.

2. 

reduce only로 복잡한 로직을 다루는 것은 명령형이나 다름 없기 때문입니다. 그리고 map+filter+reduce 조합으로 순회를 3차례 돈다고 하더라도 reduce only에서 3line 의 코드를 실행하는 것과 동일한 시간 복잡도를 갖게 됩니다. 따라서 엄청난 퍼포먼스 차이가 있을 수 없습니다. 

종합하여 말씀드리자면 map+filter+reduce 조합으로 프로그래밍 하는 것이 퍼포먼스적으로 이슈가 거의 없으면서 훨씬 좋은 표현력을 얻는 방법입니다.

감사합니다. :)

boutime2017님의 프로필 이미지
boutime2017

작성한 질문수

질문하기