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

3
ねこはる @halcat0x15a

ScalaでのEffの妥協点はこんなところかなぁ。 github.com/halcat0x15a/ki…

2016-01-01 19:09:14
ねこはる @halcat0x15a

Scalazのモナドトランスフォーマーと速度比較してみるか。

2016-01-01 19:15:33
ねこはる @halcat0x15a

というわけでこんなコードで速度を比較してみた。 github.com/halcat0x15a/ki… 手元のMacBook Proだと 0.46223246 2.68296919 って出力なんで5倍近く速い、はず。

2016-01-01 19:40:54
ねこはる @halcat0x15a

あ、StringじゃなくてVector[String]だからちょっと違うな。

2016-01-01 19:42:13
ねこはる @halcat0x15a

0.5083689 43.23210491 になった… Vectorのinstantiationが増えてStringからVectorのconcatenationに変わっただけなのだけどこんな違うのか。

2016-01-01 19:49:30
病気の美少女 @lyrical_logical

@halcat0x15a RWS monad との比較も欲しい感じする(scalaz にあるのか知らないけど)

2016-01-01 20:01:32
病気の美少女 @lyrical_logical

まあトランスフォーマーによる積みあがったモナドスタック使うの、最適化積極的にされてる Haskell でも遅いし scala(z) なら遅くて当然みたいな感じだけど、freer すごいな。Kleisli とかを構造に埋め込んでフラットにするだけでここまで早くなるのか

2016-01-01 20:05:15
ねこはる @halcat0x15a

Writerの実装がMonoidを使ってないのが不公平っぽいので直してWriter[String, ?]に関して測ったら 2.34981409 2.47337873 で差があまりない…

2016-01-01 20:07:16
ねこはる @halcat0x15a

しかしWriter[Vector[String], ?]だと 0.5888474 59.75744597 だ。 よくわからなくなってきた。

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

@halcat0x15a java.lang.String に対する特別な JIT 最適化とかかかってるのかも。-XX 系のオプションで調べるといいです。

2016-01-01 20:11:06
ねこはる @halcat0x15a

@lyrical_logical なるほど。具体的にどんなのがあります?

2016-01-01 20:14:41
病気の美少女 @lyrical_logical

@halcat0x15a どのタイミングで何がコンパイルされてるか知りたいなら -XX:+PrintCompilation で調べるのがいいんじゃないかな。あとは XX じゃなくて X 系で JIT 切れたはずだから、切って JIT の影響どれだけあるか試すとか。

2016-01-01 20:17:13
ねこはる @halcat0x15a

@lyrical_logical ありがとうございます。 ちょっとやってみます。

2016-01-01 20:17:46
病気の美少女 @lyrical_logical

@halcat0x15a ごめん JIT コンパイル無効にするの X 系じゃなかった -Djava.compiler=none だ…

2016-01-01 20:20:32
ねこはる @halcat0x15a

JIT切ったらそもそもScalazのコードがStackOverflowで動かなくなった…

2016-01-01 20:29:10
ねこはる @halcat0x15a

n=250で 8.57986238 11.91931665 だ。 JITってすごい。

2016-01-01 20:30:07
病気の美少女 @lyrical_logical

@halcat0x15a CompileThreshold の値ですか?freer が遅くなってるのは JIT コンパイルしすぎてそっちに時間かかってるのかな…warm up してから bench するといいかもですね。

2016-01-01 20:39:07
ねこはる @halcat0x15a

@lyrical_logical nはループ回数です。大きいと溢れるので…

2016-01-01 20:53:27
ねこはる @halcat0x15a

Trampolineをかまして最終的にこうなった。 github.com/halcat0x15a/ki… 結果は 41.31428502 55.61239276 でまあこんなもんかなといった感じ。

2016-01-01 20:54:42
ねこはる @halcat0x15a

RWSTも最後に加えた。 Eff: 40.48607411 MT: 55.95873723 RWST: 95.3433303 何でReaderT WriterTより遅いんだ…

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

scalaz 君…RWS 使うと遅くなるってそれ performance bug では…

2016-01-01 21:31:14
Kenji Yoshida @xuwei_k

@halcat0x15a @lyrical_logical まぁ(最近構造の変更あったので)遅いのありえなくもない(?)けど、さすがにあのコードじゃそもそも色々パフォーマンス計測方法に問題あると思うので、sbt-jmhとかでやってみます

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

@xuwei_k @halcat0x15a 確かにマイクロベンチ的には robust でないコードですが、いくらなんでも遅すぎでなんかおかしい感じはします…マジもんの performance bug じゃないといいんですが

2016-01-01 21:39:01