Windows+ActivePerlで、CGIがタイムアウトになってしまう らしいので、少し原因を調査して直してみた。
ダウンロード:webapi2_20110830.tar.gz
ついでに改行コードもWindows(CR+LF)にして、 シェルヘッダもC:/Perl/bin/perlに変更しておいた。
さすがに全く動かさないのもアレなので、 WindowsにApache2とActivePerlをインストールして、 sqlite0.plとsqlite2.plは検証してみた。 そしてWindowsのCGIが死ぬほど遅いことに気づいた。 sqlite0.plは、たった400件で30秒以上かかる。テストマシンはSempron1.6GHzだけど...遅すぎる。Linuxサーバだと0.9秒とかそんなもんなのに。
sqlite0.plのEPGデータをとってきて所定のハッシュに登録する ループがある。擬似コードで書くと、
while ($rcols = $sth->fetch()) { (カラムをリストに取り出す) (言語やタグの変換を行う) (検索条件で間引きをする) (ハッシュに入れる) }
こんな感じだが、SQLite3からデータを取り出す部分のsth->fetch()は一瞬で終わってしまい、(言語やタグの変換を行う)の部分がめちゃくちゃ時間を消費している。つまり SQLite3は白だ。
SQLの時刻文字列をPerlのDateTimeオブジェクトにするメソッドで、軽く気軽にカジュアルに、こう書いていた。
sub searchutil::sqlite3rev { my ($str) = @_; my $dt = DateTime->now( time_zone=>'local' ); if ($str =~ m!([\d]+)-([\d]+)-([\d]+)\s([\d]+):([\d]+):([\d]+)!) { $dt->set(year=>$1, month=>$2, day=>$3, hour=>$4, minute=>$5, second=>$6); } return $dt; }
........別におかしくないよなあ?と思ったら
なんぞこれ。ActivePerlのバグじゃないのか。それともWindowsは現在時刻とってくるのにこんなウェイトが必要だというのか!!! 結局最初に1つだけ作成して、clone()で複製を作るようにしました。
人生という冒険は続く(劇違)