Haskell風AltJSのベンチマーク

  • 60
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

みんな大好きHaskell風altJS!みんな違ってみんな良いのですが、やはり気になるのは生成するjsの速度やサイズですね!

今回は竹内関数を使用してベンチマークを行ないました!

エントリー

ベンチマーク条件

  • ベンチマークには正格評価の竹内関数(Tarai)を使用した
  • コードは以下のHaskell実装をベタ移植した1 2
  • コンパイルされたコードをuglifyjsにより圧縮した
  • javascriptの実行にはnode-0.10.35を使用した
  • ベンチマークは10回実行し、process.hrtime関数で計測した
  • 実行環境はMac book air Mid 2011(メモリ4GB, CPU 1.8GHz Core i7)を使用した(しろめ
tarai.hs
module Main where

tarai :: Int -> Int -> Int -> Int
tarai x y z = x `seq` y `seq` z `seq` tarai' x y z

tarai' :: Int -> Int -> Int -> Int
tarai' x y z =
    if x <= y
    then y
    else tarai (tarai (x-1) y z) (tarai (y-1) z x) (tarai (z-1) x y)

main :: IO ()
main = print (tarai 11 5 0)

結果

ファイルサイズ

name size size(readable)
elm 43131 42K
fay(no-opt) 58376 57K
fay(opt) 92315 90K
ghcjs(no-opt) 653498 638K
ghcjs(opt)3 653498 638K
haste(no-opt) 42367 41K
haste(opt) 3165 3.1K
idris 18546 18K
javascript 281 281B
purescript 2762 2.7K
  • purescriptのファイルサイズの小ささは特筆すべき点っぽい。
  • haste-optも良好だけれど最適化するとデフォルトで使用されるclosure compilerの効果が大きい(--opt-minifyを切ると同等となる為)。
  • idrisはVMを使用している割には小さなファイルを吐いている

ベンチマーク

エラーバーは標準偏差を示す
表に起こすのがダルかったので詳しくは生データを見てください><

11-5-0-all

速い分のみ
11-5-0-zoom

14-7-0-zoom

  • fay, ghcjs, idrisは……流石に大きな物を作るにはつらそう。
  • purescriptは関数を全てカリー化して使用するのであまり奮わない様に見える。
  • 一方、Elm-langでは完全適用する場合はカリー化していない関数に適用する為、その差が顕著にあらわれている。
  • hasteは使ってないので良くわからないけどスゴい!!!

その他所感とか

  • hasteすごいのにどうして流行っていないんだ……

    hasteのここがスゴい!!

    • Haskellのコードをそのまま使用出来る!!(今回使用した中ではghcjsとhasteのみ)
    • もちろんGHC拡張も使用出来る!!!(Template Haskellを除く)
    • hackageのパッケージを使用出来る!!!
    • バイナリが有ってインストールが簡単!!!
    • 遅延評価!!!
    • 速い!!!!

    ほんとどうして流行ってないんだ……全くライブラリが無い&&イマイチどうやって公開すれば良いかわからないからか……

  • elmはまぁまぁ優等生な感じ(但しまだ特に型関連でどギツいバグある

  • purescript応援してるのでガンバってください><


今回のコードなどはこちら


  1. fayがBangPatternsに対応していなかったのでコードを統一するため相互再帰させた。 

  2. idrisでは相互再帰の仕方が解らなかったので、どうせ遅いし相互再帰部分を省略した。 

  3. 非最適化版と同一だった