目次
Haskellを使ってRubyのクラスメソッドを書く
(その1)FFI
(その2)FFI+JSON
(その3)FFI+MessagePack
(その4)まとめ <- ここ
##ベンチマークの結果
Ruby側で
data=[*1..1000].map(&:to_f)
の1000個の要素からなる配列用意しencode->(Haskell側)decode->2倍->encode->(Ruby側)decodeを100回繰り返した時間を測定しています。単位はミリ秒です。
全体(a) | Ruby部分(b) | (a)-(b) | |
---|---|---|---|
FFI (その1) | 5.8 | 1.6 | 4.2 |
FFI+JSON (その2) | 298.8 | 40.6 | 258.2 |
FFI+MessagePack (その3) | 72.4 | 4.3 | 68.1 |
(b)はRuby側だけの処理でencode->(Ruby側)decodeでHaskell部分を取り除いた時間
(a)-(b)は引き算してHaskell側だけの時間にした値です。Haskell側の処理がかなりかかっているようですので、改善の余地はありそうです。
FFIが一番高速で単純なデータ構造の場合はこちらが適しているようです。
MessagePackが健闘しており、複雑なデータ構造の場合は良さそうです。
(JSON, MessagePack共に) [[Double]] -> [(Int, Int, Double)]のような構造でも簡単に受け渡しできます
CPU Intel Core i7-2600 CPU 3.40GHz
Scientific Linux 7.3
GHC 8.2.2
Ruby 2.5.1p57
stack 1.6.5