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()で複製を作るようにしました。
人生という冒険は続く(劇違)
![[BANNER]](../image/banner.png)
|