countコマンドのRuby版アルゴリズムにHaskell/Pythonも合わせてみた+メモ化に関する疑問
こちらのベンチマークで一位を取ったHaskell vs Python vs Ruby(ファイルの中身の文字数、ワード数、行数を表示するコマンド) - しんちゃんの日記Rubyのアルゴリズムに、Haskell/Pythonもコードを合わせて再度、ベンチマークを取り直してみました。
結論から言うと、Rubyが一位は変わらなかったですが、Pythonがかなり肉薄。Haskellは、0.5秒ほど高速化しました。
これは、Python/Rubyはファイルを読み込んだ時点で、長さもカウントしてオブジェクト内の変数に格納していると考えられるためで、純粋に文字数をカウントしてしまうHaskellのlength関数はどうしても不利になってしまいます。
(それでも、実用的な速度で収まっているのはさすがコンパイラ言語で、Linuxのソースコード程度なら、まだHaskellの方が速かったりします)
では、各言語のソースコードと、ベンチマーク結果です。(条件を限りなく同じにするため、Rubyもベンチ取り直してます)
まずは、コードから
>|haskell|
import System.Environment
main = getArgs >>= \fnames ->
mapM readFile fnames >>=
mapM_ (\(x,y) ->
putStrLn $ concat [x,
"\nchars = ", show $ (sum.map length $ words y) + (length $ words y) - 1,
" words = ", show.length $ words y,
" lines = ", show.length $ lines y, "\n"]).zip fnames
|