Perl ページ表示遅い ループの改善
ソースが汚いかもしれませんが、ご教示お願い致します。
実行したいことは、できてはいるのですが、
「表示が遅い」です。
ループのやり探し、
サーバー上でのHTML生成が
原因だと思うのですが、
どう改善すればいいのかわかりません・・・
・下記のソースの簡単な説明
あるテキストファイルにCSV方式でデータを記録してあります。
(最終で200万バイトくらい)
(現在 12万バイト)
そのデータで1列目に順位の数字があり
(~20位前後)
それを、いろんな条件で絞込し一気に表示してます。
そこから、サーバー上でテーブルとして表示させているのですが
とにかく遅いです。
・・・サーバー上で計算するからでしょうが・・・
もう少し速くする方法はないでしょうか?
スクリプトでHTMLを生成させることはできるのですが、
サーバーにデータのみを保存させ
そこから生成させたいのです・・・
※だいたい10秒前後(Wi-Fi有りで)
Wi-Fiの環境がなく、さらに回線が3Gまでに
なっている人だと絶望的な状況だと・・・
下記のソースで、
(1)おかしな点
(2)改善すれば速くなる点
(3)別の案
を教えてほしいです・・・
------ソース------
my @DataNo = ("13","14","2","1","8");
my $DataName;
for(my $dn=0;$dn<=$#DataNo;$dn++){
my $DataNo = $DataNo[$dn];
my ($No) = split(/,/, $DataNo);
if($No eq "13"){ $DataName = "A" }
if($No eq "14"){ $DataName = "B" }
if($No eq "2"){ $DataName = "C" }
if($No eq "1"){ $DataName = D" }
if($No eq "8"){ $DataName = "E" }
print <<END;
<h2 class="ResMidashi"> $DataNameデータ</h2>
<table class="ResultData">
<tr>
<td>[$DataName]</td>
<th>Test1</th>
<th>Test2</th>
<th>Test3</th>
</tr>
END
my %hash = ();
my @arrey;
open(F, "<","../Test/Test.txt") or die("error :$!");
eval{ flock(F, 1) };
while(<F>){
chomp;
my @temp1 = split /,/;
push @arrey , $temp1[$No];
}
close F;
foreach (@arrey) {
$hash{$_}++;
}
my @Data;
if($No eq "1" || $No eq "2" || $No eq "9"){
@Data = sort keys %hash;
}
else{
@Data = reverse sort keys %hash;
}
my $matches = 0;
my $Count1 = 0;
my $Count2 = 0;
my $Count3 = 0;
for(my $Co=0;$Co<=$#Data;$Co++){
my $DATA = $Data[$Co];
my ($Main) = split(/,/, $DATA);
open(F, "<","../Test/Test.txt") or die("error :$!");
eval{ flock(F, 1) };
while(<F>){
chomp;
my @temp2 = split /,/;
if( $temp2[5] eq "$JoukenA" and $temp2[6] eq "$JoukenB" and $temp2[7] eq "$JoukenC"){
if( $temp2[$No] =~ /^$Main$/ ){
$matches++;
$Count1++ if $temp2[0] == "1";
$Count2++ if $temp2[0] == "2";
$Count3++ if $temp2[0] == "3";
}
}
}
my $T;my $P;
if($matches){
$T = ($Count1 / $matches) * 100;
$T = sprintf('%.2f', $T);
$P = (($Count1 + $Count2 + $Count3) / $matches) * 100;
$P = sprintf('%.2f', $P);
my $Frame1;my $Frame2;
if($Puk ne "0.00"){
print <<END;
<tr>
<td>$Main</td>
<th>$Count1-$Count2-$Count3-$matches</th>
<th>$T</th>
<th>$P</th>
</tr>
END
}
}
$matches = 0;
$Count1 = 0;
$Count2 = 0;
$Count3 = 0;
if($Co eq $#Data){last;}
}
print <<END;
</table>
END
}
お礼
回答いただきありがとうございます。 とても参考になりました!