一覧画面が遅い理由がわかったー
修正済み。遅い原因はほかのライブラリによるものだったので、今晩か明日ぐらいに根本的な原因を探る。今のところは回避策が思いついたので、回避した。
追記
遅い原因は日本語文字列を短く切る為に使用していたLingua::JA::Jtruncateというモジュールにあった。これはeuc/sjis/jisの文字列を指定した長さに切ってくれる関数を持っている。うまく機能したので、ありがたく使っていたのだけど、その主要な処理を行う以下のchop_jcharsが遅いんだ。
## Lingua::JA::Jtruncateオリジナルのchop_jchars関数 sub chop_jchars { my $text = shift; my $length = shift; my $encoding = shift; while( length( $text ) > $length ) { return undef unless $text =~ s!$char_re{ $encoding }$!!o; } return $text; }
while分の中で、”(日本語でいう)1文字ずつ”切っているような形になっている(精確には制御文字もあるので1”文字”ではないこともある)。だから長文を切る時、遅い事遅いこと。
というわけで、逃げの1手として次のように変更したなお、chop_euc_charsは日本語文字列を切り詰めるPerlの関数 : blog.nomadscafe.jpを参考にした(というかほとんどそのまま)。
sub chop_euc_chars { my($str, $length)=@_; return $str if(length($str) <= $length); my $substr = substr($str,0,$length); if($substr =~ /?x8F$/ or $substr =~ tr/?x8E??xA1-?xFE// % 2){ chop $substr; } return $substr; } sub chop_jchars { my $text = shift; my $length = shift; my $encoding = shift; if ($encoding eq "euc") { return chop_euc_chars($text, $length); } while( length( $text ) >= $length ) { return undef unless $text =~ s!($char_re{ $encoding })$!!o; } return $text; }
とりあえず、chop_euc_charsはeuc専用で、WebNoteでは全部EUC使ってるから、これで解決。
//ただし、半角カタカナと英数字が絡むと最後の1字が化けることを確認済み。