Scalaでモナドのベンチマーク

3
Kenji Yoshida @xuwei_k

@lyrical_logical @halcat0x15a この変更 github.com/scalaz/scalaz/… に関しては、stack overflowしないパターンがふえたかわりに場合によっては遅くなる変更だったとは思ってます(が、計測してないので根拠はない)

2016-01-01 21:41:27
ねこはる @halcat0x15a

@xuwei_k なるほど。 ならRWSTの方はTrampolineかまさなくてもいいのですね。

2016-01-01 21:50:19
Kenji Yoshida @xuwei_k

@halcat0x15a かと思って使わなかったらstack overflowしました・・・(特定のパターンのみで、すべてのパターンで不必要なわけではないっぽい)

2016-01-01 21:52:04
Kenji Yoshida @xuwei_k

@halcat0x15a @lyrical_logical とりあえずの成果です (3つとも大差なくて、あえて言うならfreer一番遅くてRWSTが速い?) github.com/xuwei-k/kits/c… gist.github.com/xuwei-k/c8f311…

2016-01-01 21:59:26
病気の美少女 @lyrical_logical

@xuwei_k @halcat0x15a RWS 遅いのさすがに performance bug ですねえ、何が悪いのやら…

2016-01-01 22:02:57
Kenji Yoshida @xuwei_k

@halcat0x15a scalaz7.1.6も試したがそこまで大きな違いなさそう(というかscalaz.Free = Trampolineも7.2で構造変わった影響で、純粋なRWSTだけの違いが出ないかもしれない、という) gist.github.com/xuwei-k/bdace4…

2016-01-01 22:11:10
Kenji Yoshida @xuwei_k

@lyrical_logical @halcat0x15a HaskellでRWST使うと、普通にReaderやWriter組み合わせるより、何倍も速くなったりするんです?

2016-01-01 22:12:50
病気の美少女 @lyrical_logical

@xuwei_k @halcat0x15a 結局モナドトランスフォーマーかますのって、誤解を恐れずにいうと何重もの boxed な値扱うことになるので…値コンストラクタ一つしかないデータ型に対する最適化が GHC に入って少しは改善されたはずですが、部分的解決でしかない

2016-01-01 22:21:01
病気の美少女 @lyrical_logical

@xuwei_k @halcat0x15a ので皆独自にまとまったモナドを定義するわけです(あと lif . lift . lift とか読み書きしたくないし)。有名どころだと yesod が昔モナドスタックすごくてくそ重かったのをモナドまとめたらあほみたいに速くなってましたね

2016-01-01 22:22:12
病気の美少女 @lyrical_logical

@xuwei_k @halcat0x15a 昔の話だから発掘するのに時間がかかった…この変更で滅茶苦茶早くなってた気がします github.com/yesodweb/yesod…

2016-01-01 22:42:53
ねこはる @halcat0x15a

@xuwei_k あれ、これってops/sでScore高い方が速い感じですか?

2016-01-01 23:35:55
Kenji Yoshida @xuwei_k

@halcat0x15a あ、なるほど、勘違いしてたかも。そしたらFreerが一応速い?

2016-01-01 23:40:10
病気の美少女 @lyrical_logical

@xuwei_k @halcat0x15a 書き間違えたのかなと思って RWS 遅いですね~みたいにいってたら普通に勘違いだったゾ ('-')

2016-01-01 23:42:59
ねこはる @halcat0x15a

Stringは差はあまりないけどVectorなんかだと 1886.960±740.159ops/s 21.780±49.707ops/s 23.459±2.569ops/s くらいの差が出る。

2016-01-01 23:43:32
ねこはる @halcat0x15a

ちゃんと記事にまとめよ。 今月中に。(意識低い

2016-01-01 23:51:01
病気の美少女 @lyrical_logical

@halcat0x15a java.lang.String みたいな簡単なのだと JIT でモナドスタックに対してインライン化やなんていうのか忘れたけど構造体作らない感じの最適化が効くのが、Vector だと起きなくてモナドスタックだば~みたいな感じですかね、謎だ…

2016-01-01 23:51:23
ねこはる @halcat0x15a

@lyrical_logical Stringに対して最適化が効くっていうのはありそうな話ですがここまで差が出るのは面白いですね。 Freerはむしろ遅くなってるっていう…

2016-01-01 23:55:29
ねこはる @halcat0x15a

同じPCでStringに対して測ると 365.783±670.799ops/s 332.757±432.263ops/s 276.463±120.101ops/s って結果で、effはむしろ遅くなってる。 JITの不思議だ…

2016-01-01 23:58:41
病気の美少女 @lyrical_logical

@halcat0x15a それ単に Monoid ていうかようは concat の性能特定でしょう。Vector はリストみたいなもんだから O(1)、String は O(N)

2016-01-02 00:04:59
ねこはる @halcat0x15a

@lyrical_logical ああ、StringってO(N)なんですね。知らなかった…

2016-01-02 00:12:41