負荷を小さくするには?
[上に]
[前に]
[次に]
匿名
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/ に入っているので、使い方はそれを見て下さい。
[上に]
[前に]
[次に]