やはりIO/文字列処理が遅い
bm_so_count_word.rbが少し変更して動くようになりました。まだ、File#joinが動かないのでこんな感じに変更します。
#!/usr/bin/ruby # -*- mode: ruby -*- # $Id: wc-ruby.code,v 1.4 2004/11/13 07:43:32 bfulgham Exp $ # http://www.bagley.org/~doug/shootout/ # with help from Paul Brannan #input = open(File.join(File.dirname($0), 'wc.input'), 'rb') input = File.open(File.dirname($0) + '/wc.input', 'rb') nl = nw = nc = 0 while true tmp = input.read(4096) or break data = tmp << (input.gets || "") nc += data.length nl += data.count("\n") ((data.strip! || data).tr!("\n", " ") || data).squeeze! nw += data.count(" ") + 1 end STDERR.puts "#{nl} #{nw} #{nc}"
実行結果です。
> time ruby yarv2llvm.rb ~/src/ruby/benchmark/bm_so_count_words.rb 204800 1122304 49938432 real 0m1.336s user 0m1.236s sys 0m0.072s > time ruby ~/src/ruby/benchmark/bm_so_count_words.rb 204800 1122304 49938432 real 0m0.900s user 0m0.828s sys 0m0.072s
yarv2llvmの方が圧倒的に遅いです。コンパイル時間を考慮するとRuby 1.9.2と大体同じくらいの速度かなと思います。それでも若干yarv2llvmの方が遅いので、無駄な型変換が入っているのかもしれないです。
> time ruby yarv2llvm.rb --compile-only ~/src/ruby/benchmark/bm_so_count_words.rb real 0m0.360s user 0m0.328s sys 0m0.024s
ちなみにRuby1.8.7はかなり速いです。
> /usr/bin/ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] > time /usr/bin/ruby ~/src/ruby/benchmark/bm_so_count_words.rb 204800 1122304 49938432 real 0m0.640s user 0m0.588s sys 0m0.052s
いろいろ見てみて、文字列処理が実行時間の多くを占めていそうだということは分かったのですが詳細は今後追ってみます。いずれにしても、yarv2llvmは今のところRailsなこと(Railsが動く見込みは全然ないけど)には向かないことがよく分かります。
m17nとか全然分かってないのですが、文字コードの静的推論とかやると速くなるのかなとか妄想しています。