@lyrical_logical @halcat0x15a この変更 github.com/scalaz/scalaz/… に関しては、stack overflowしないパターンがふえたかわりに場合によっては遅くなる変更だったとは思ってます(が、計測してないので根拠はない)
2016-01-01 21:41:27@halcat0x15a かと思って使わなかったらstack overflowしました・・・(特定のパターンのみで、すべてのパターンで不必要なわけではないっぽい)
2016-01-01 21:52:04@halcat0x15a @lyrical_logical とりあえずの成果です (3つとも大差なくて、あえて言うならfreer一番遅くてRWSTが速い?) github.com/xuwei-k/kits/c… gist.github.com/xuwei-k/c8f311…
2016-01-01 21:59:26@xuwei_k @halcat0x15a RWS 遅いのさすがに performance bug ですねえ、何が悪いのやら…
2016-01-01 22:02:57@halcat0x15a scalaz7.1.6も試したがそこまで大きな違いなさそう(というかscalaz.Free = Trampolineも7.2で構造変わった影響で、純粋なRWSTだけの違いが出ないかもしれない、という) gist.github.com/xuwei-k/bdace4…
2016-01-01 22:11:10@lyrical_logical @halcat0x15a HaskellでRWST使うと、普通にReaderやWriter組み合わせるより、何倍も速くなったりするんです?
2016-01-01 22:12:50@xuwei_k @halcat0x15a 結局モナドトランスフォーマーかますのって、誤解を恐れずにいうと何重もの boxed な値扱うことになるので…値コンストラクタ一つしかないデータ型に対する最適化が GHC に入って少しは改善されたはずですが、部分的解決でしかない
2016-01-01 22:21:01@xuwei_k @halcat0x15a ので皆独自にまとまったモナドを定義するわけです(あと lif . lift . lift とか読み書きしたくないし)。有名どころだと yesod が昔モナドスタックすごくてくそ重かったのをモナドまとめたらあほみたいに速くなってましたね
2016-01-01 22:22:12@xuwei_k @halcat0x15a 昔の話だから発掘するのに時間がかかった…この変更で滅茶苦茶早くなってた気がします github.com/yesodweb/yesod…
2016-01-01 22:42:53@xuwei_k @halcat0x15a 書き間違えたのかなと思って RWS 遅いですね~みたいにいってたら普通に勘違いだったゾ ('-')
2016-01-01 23:42:59Stringは差はあまりないけどVectorなんかだと 1886.960±740.159ops/s 21.780±49.707ops/s 23.459±2.569ops/s くらいの差が出る。
2016-01-01 23:43:32@halcat0x15a java.lang.String みたいな簡単なのだと JIT でモナドスタックに対してインライン化やなんていうのか忘れたけど構造体作らない感じの最適化が効くのが、Vector だと起きなくてモナドスタックだば~みたいな感じですかね、謎だ…
2016-01-01 23:51:23@lyrical_logical Stringに対して最適化が効くっていうのはありそうな話ですがここまで差が出るのは面白いですね。 Freerはむしろ遅くなってるっていう…
2016-01-01 23:55:29同じ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@halcat0x15a それ単に Monoid ていうかようは concat の性能特定でしょう。Vector はリストみたいなもんだから O(1)、String は O(N)
2016-01-02 00:04:59