一覧画面が遅い理由がわかったー

修正済み。遅い原因はほかのライブラリによるものだったので、今晩か明日ぐらいに根本的な原因を探る。今のところは回避策が思いついたので、回避した。

追記

遅い原因は日本語文字列を短く切る為に使用していた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字が化けることを確認済み。