Ruby
Haskell
ghc
ffi

Haskellを使ってRubyのクラスメソッドを書く(その4)まとめ

目次

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