負荷を小さくするには?

[上に] [前に] [次に]
匿名 1999/06/28(月) 02:41:50
#!/usr/bin/perl

$datafile = "./log.txt";

open(IN,$datafile);
@IN=<IN>;
for ($i=0; $i<20; $i++) {
print $IN[$i];
}

close(IN);

といううふうに、先頭の20行を表示するものを
作ったのですが、他に負荷を小さく同じような処理をする方法ありますか?
何度も利用するのでなるべく負荷をかけたくないです。
お願いします。

Aurai [E-Mail] 1999/06/28(月) 05:44:20
open(IN,$datafile);
for(0..19){$_=<IN>;print;}
close(IN);

はどうでしょう
細かいパフォーマンスは測ったことがありませんが
データファイルが小さいなら一気に読み込んだ方が早いんでしょうか?

ふじ 1999/06/28(月) 15:21:03
以下のようなコードで測定してみました。
(環境:Celeron 333, 128MB, Windows NT4.0, Perl 5.005_03)

#!/usr/local/bin/perl
use Benchmark;

open (OUT , "> result.txt");
$count = 1000;
$datafile = "data.txt";

@t = timethese($count , {
'ALL ' => '&all;',
'STEP' => '&step;'
});
exit;

sub all{
open (DATA, "< ./$datafile");
@data = <DATA>;
for ($i=0; $i<20; $i++) {
print OUT $data[$i];
}
close DATA;
}
sub step{
open (DATA, "< ./$datafile");
for ($i=0; $i<20; $i++) {
$_ = <DATA>;
print OUT $_;
}
close DATA;
}

結果、
data.txt : 100 lines ,  6.4KB
ALL :  3 wallclock secs ( 1.71 usr +  0.54 sys =  2.25 CPU)
STEP:  1 wallclock secs ( 0.60 usr +  0.44 sys =  1.04 CPU)

data.txt : 1000 lines , 65KB
ALL: 14 wallclock secs (11.28 usr +  1.69 sys = 12.97 CPU)
STEP:  1 wallclock secs ( 0.65 usr +  0.40 sys =  1.05 CPU)

data 10000 lines ,  660KB
ALL : 123 wallclock secs (112.23 usr +  9.75 sys = 121.99 CPU)
STEP:  2 wallclock secs ( 0.59 usr +  0.44 sys =  1.03 CPU)

ということで。一行ずつ読む方が速いです。メモリも喰わないし。

>データファイルが小さいなら一気に読み込んだ方が早いんでしょうか?

data.txt : 20lines ,  1.26KB
ALL : 15 wallclock secs ( 7.41 usr +  4.56 sys = 11.97 CPU)
STEP: 13 wallclock secs ( 5.36 usr +  4.36 sys =  9.71 CPU)
(註:これだけ $count = 10000 としてます)
データファイルが小さくても、1行ずつ読んだ方が速いみたいです。
配列の処理に時間を喰われるんでしょうか。

長文失礼。

匿名 1999/06/30(水) 07:23:55
お返事ありがとうございます。
負荷を計るようなソフトがあるんでしょうか?

ふじ 1999/06/30(水) 13:37:34
Perlの標準ライブラリに Benchmark.pm ってのがありまして、
それを使ってみました。
perl/lib/ に入っているので、使い方はそれを見て下さい。

[上に] [前に] [次に]