あき
attin****@kk*****
2006年 1月 22日 (日) 14:10:01 JST
あきです。 > > > > キーワード検索結果を色分け表示させるプラグイン > > > > http://fswiki.poi.jp/wiki.cgi?page=BugTrack%2Dplugin%2F235 > > > > > > > > 上記は、私がちょっと以前に作成したプラグイン(パッチ)ですが、本体への > > > > 取り込みに関してはいかがでしょう? >竹添殿 > > > > > > 取り込みましょうか。もう一度パッチを見てみます。 > > > > ありがとうございます。 > > ソースを見られるのはとても恥ずかしいかぎりです。 > > 凝っている部分もあれば、力業の部分もあったりして温度差が激しいです。A^_^; > > コミットするのでしたら、きちんと見直した方が良いかもしれません。 > > ソースを眺めてみたのですが、なぜこれで速くなるのかが理解できませんでした。 > > index関数で検索してから詳細マッチを行っているからでしょうか?でもオリジナル > ではindex関数での検索しか行っていないので、それ以上速くなるとは思えないの > ですが… > > よろしければ解説をお願いできないでしょうか? あまり難しく考えないで下さい。 何だか過度な期待を持たれているようで恐縮です。 高速に動作するのは、検索キーワード内に半角英字が含まれていない場合だけ です。予めご承知おき下さい。 高速化に貢献しているのは下記の部分です。 ---------------------------------------------------------------------- my $page2 = ""; if($word =~ /[A-Za-z]/){ $page2 = Jcode->new($page)->tr('a-z','A-Z'); } ---------------------------------------------------------------------- ---------------------------------------------------------------------- my $index = 0; if($page2){ $index = index($page2,Jcode->new($_)->tr('a-z','A-Z')); }else{ $index = index($page,$_); } ---------------------------------------------------------------------- オリジナルのソースでは、半角大小文字を同一視するために、一度、検索キー ワードも全ページの内容も半角大文字に変換しています。 この変換(コピー)が遅くなっている原因です。 index関数で検索を高速化しても、その前に全文コピーを行うなら、その効果は 全く活きてきません。 FSWikiの過去を遡ると、半角大小文字の同一視は後から拡張された仕様のようで、 そう考えるとこのようなロジックになってしまった理由も理解できます。 もし、この仕様に本格的に対応しようとしていたなら、(「大小文字同一視」の オプションが存在しない)index関数の使用は諦め、通常の正規表現に切り替え て、アルゴリズムそのものも見直していたはずです。 ですから、私の今回の修正は、「index関数の効果が期待できるときくらいは、 その効果を活かさせてもらおう」としただけにすぎません。 特に凄いことをやっているわけではありませんので、気楽にお考え下さい。 本当に高速化を考えるなら、ページ内容を1行毎に配列に入れておけば効率的に 処理できるはずです。さすれば、後で検索にマッチした行を取り出す際の改行 コードの前後サーチなども不要になります。 お時間を頂けるなら頑張ってみましょうか? 上述の条件文を入れるだけでも、まずは十分だと思いますが…。