やはり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とか全然分かってないのですが、文字コードの静的推論とかやると速くなるのかなとか妄想しています。