• 作成:

perl6の速度が現在どれぐらいなのか気になったのでマイクロベンチマークを取ってみました

perl6はまだまだ開発途上です. この記事はすぐに古くなるでしょう.

動機

googleがpython2からpython3に移行せずにpython2だけ対応したライブラリをリリースしやがる.

python3に移行するだけでそこそこ速くなるのに勿体無いですね, いや, 今後アップデートのない言語を使う事自体がまず論外なんですが…

そんなことを考えていると, そう言えばperlの影響を受けたrubyの影響を受けたperl6があるじゃないか, python3を飛び越してperl6に移行すれば良いのでは? なんてアイデアが浮かんできました.

そこで, とりあえずperl6って今現在の所, 速度はどれぐらいなんだろうなあと思い, 少し計測してみることにしました.

あくまで簡易的でいい加減な計測であることを御容赦願いたい.

レギュレーション

大量の整数を読み込んで合計する.

データは標準入力から読み込む.

整数は改行区切りで与えられる.

整数はhaskellで

replicateM 1000000 (show <$> randomRIO (0, 1000000)) >>= (\l -> writeFile "data.txt" (unlines l))

で生成される.

まず変数lにリストや配列の文字列としてデータを読み込み, 変数sに古典的なループで合計すること.

rust

まず基準を測るためにrustで. オーバーフローしてることに気が付かず少し躓きました.

use std::io;
use std::io::Read;
fn main() {
    let mut buffer = String::new();
    io::stdin().read_to_string(&mut buffer).ok();
    let l = buffer.lines();
    let mut s: u64 = 0;
    for i in l {
        s += i.parse().unwrap();
    }
    println!("{}", s);
}
% cat data.txt|time ./bench_sum
499752192572
./bench_sum  0.03s user 0.00s system 96% cpu 0.031 total

python

もちろんバージョンは3です.

import sys
l = sys.stdin.readlines()
s = 0
for i in l:
    s += int(i)
print(s)
% cat data.txt|time python bench_sum.py
499752192572
python bench_sum.py  0.37s user 0.02s system 99% cpu 0.386 total

ruby

l = STDIN.readlines
s = 0
for i in l
  s += i.to_i
end
puts s
% cat data.txt|time ruby bench_sum.rb
499752192572
ruby bench_sum.rb  0.36s user 0.01s system 74% cpu 0.503 total

perl6

ちなみにこのperl6のバージョンは

% perl6 -v
This is Rakudo version 2017.02 built on MoarVM version 2017.02
implementing Perl 6.c.

MoarVMのものです. JVMバックエンドのものはgentooで簡単にインストールできなかったからやめました.

my Str @l = $*IN.lines;
my Int $s = 0;
for @l -> $i {
    $s += $i.Int
}
$s.say
% cat data.txt|time perl6 bench_sum.pl6
499752192572
perl6 bench_sum.pl6  5.69s user 0.05s system 99% cpu 5.746 total

結果

time

そんなに最適化が進んでいない段階だから勝てないだろうなあと思ってはいたけれど, ここまで差がついているとは… サンプル数を増やして比べてみてもそこまで差が縮まったわけでもないので, VMのブートに時間がかかっているわけでもなさそうです. pythonやrubyは遅い遅いと言われながら, やはり最適化は頑張っているのだなあと思いました.

googleはpython2問題をどうするのでしょうか. 最近公式言語に決まったTypeScriptに移行すれば爆速かつ柔軟なことが出来そうですが. golangはpythonを代替するのには難しいでしょうかね… 個人的な願望としては唐突にhaskellへの移行を決めてライブラリをガンガン開発して欲しいです.

perl6はまだまだ開発途中なので, そのうち速くなってくれるでしょう.