Elm의 Stream 라이브러리로 화면을 만들면
Elm의 Stream 라이브러리를 사용해 보았습니다.
Elm Advent Calender 19일째입니다.
Elm의 Adkale은 활발합니다!
작년의 elm Advent Calender에서는 lm-native-ui로 ios 앱을 만들었습니다 -> 기사
stream
어떤 때에 사용할 수 있을까?
쉬운 사용법
singleHoge : Stream String
singleHoge = Stream.singleton "hoge"
streamFromList : Stream String
streamFromList = Stream.fromList ["hogo", "huga", "hugi"]
concatStream : Stream String
concatStream = Stream.concat singleHoge streamFromList
elementAndTail : (String, Stream String)
elementAndTail = Stream.next concatStream
-- -> ("hoge", ["hogo", "huga", "hugi"])
listFromStream : List String
listFromStream = Stream.toList concatStream
-- -> ["hoge", "hogo", "huga", "hugi"]
타임 라인적인 것을 만들어 보아 검증
List로 만들어보기
type alias Feed = {
id: Int,
subject: String,
text: String
}
type alias Model = {
feeds: List Feed
}
type Msg =
ReceiveFeed Feed
update msg model =
case msg of
ReceiveFeed feed ->
( { feeds = feed :: model.feeds }, Cmd.none )
feedView feed = div [] [ text feed.subject ]
feedList = List.map feedView >> List.take 10
view model = div [] (model.feeds |> feedList)
port receiveFeedPort : (Feed -> msg) -> Sub msg
init = ({ feeds = [] }, Cmd.none)
main =
Html.program
{ view = view
, init = init
, update = update
, subscriptions = always <| receiveFeedPort ReceiveFeed
}
Stream으로 만들어 본다 (변경 부분 만 기재)
type alias Model = {
feeds: Stream Feed
}
update msg model =
case msg of
ReceiveFeed feed ->
( { feeds = Stream.concat (Stream.singleton feed) model.feeds }, Cmd.none )
init = ({ feeds = Stream.fromList [] }, Cmd.none)
feedList = Stream.map feedView >> Stream.nextN 10 >> Tuple.second
움직였다.
↓이런 느낌
피 c. 라고 r. 이 m/f5pC44우 Hfb — 스 (@4245Ryomt) 2017년 12월 19일
List version
- 300000 레코드 정도 흘려 넣으면 화면의 갱신이 뻣뻣해진다
- Perfomance 도구에서 상황을 보면 힙을 엄청난 기세로 소비하고 있습니다 (소비 600MB까지 아가)
- 그 영향인가 minor gc가 빈발해 시간이 걸려 화면이 가쿠가쿠가 되어 있는 것 같다 (?)
스트림 버전
그래프 봐서 움직임 전혀 당연하지. . .
감상
- 적당한 샘플에서의 비교로, 이것으로 좋은 것인가‥? 감이 있지만 Stream을 사용하여 장점을 느낄 수 있었다.
- 왜 Stream이라면 heap를 소비하지 않는가?
- map이나 filter라든지 읽어도 곧 새로운 인스턴스가 되지 않으니까? Array 낭비 생성되지 않기 때문에?
- 왜 이 Stream이라면 좋은 느낌인지, 설명이 붙도록 정진하겠습니다.
Reference
이 문제에 관하여(Elm의 Stream 라이브러리로 화면을 만들면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/4245Ryomt/items/4b515d83ff93523e5722텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)