akaishi です。

From: Inaba Hiroto <inaba / sdd.tokyo-sc.toshiba.co.jp>
Subject: [ruby-list:14413] Re: goo.rb
Date: Fri, 21 May 1999 13:35:28 +0900

> この2つで, Perlに不利だと思う点が2つあります.  1つはrubyがCで書かれた
> Kconv.toeucを使っているのにPerlではPerlで書かれたjcode::eucを使ってい
> る点. もう一つは getkeywords 関数内で, rubyではKeyStrから作られる正規
> 表現を一回しかRegexp.compileしないのに, Perlでは「/$keystr/i」と毎回コ
> ンパイルする事です.

おっしゃるとおりです。一応、事前実験でループの中身の実行時間はさほど多く
ないとわかっていたのですが、あらためて計り直しました。

ループの中身を排除して計測

ruby-1.3.3-990513	2秒05	(ループの中身を排除していないと 2秒42)
perl			2秒46	(ループの中身を排除していないと 3秒07)

ruby 版は、goo4.rb のループを以下のように変更
while access_log = gets
  if access_log.index(??) && access_log =~ CompiledHosts
    robothost = $1
    if access_log =~ CompiledRegex
      host, date, target, args = $1, $2, $3, $4
    end
  end
end


perl 版は、(試した中では一番速かった)goo3.pl のループ部分を以下のように変更
while (<>) {
  if (index($_, '?') >= 0) {
    if (/$regexstr/o) {
      ($host, $date, $target, $robothost, $args) = ($1, $2, $3, $4, $5);
    }
  }
}


> 上の2つがこの結果にどれくらい効いているのかはさだかではありませんが, 
> 正規表現の照合速度の優劣を比較するのなら照合以外の要素をなるべく取り除
> いておかないと, はっきりした事はいえないと思います.

そうですね。

今回のプログラムでは結局 ruby が速かったですが、もちろんこれをもって
perl より ruby の方が速いというつもりはないです。パターンによってはこ
ういうこともあったということで。