こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perl 処理速度について

ブログを作成し、カテゴリー別に分けたく下記のようなソースを
書きました。

sub category1
{
open(FILE, "<$FILE") or die("error :$!");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;
$a = 0;
my @category1 = grep(/,1,/, @DATA);
while (<@category1>) {
$a++;
}
&buffer();
if($start > @DATA) {$start = @DATA;}
$next = $start + 100;
$back = $start - 100;
if ($back < 0) { $back = 0; }
for ($i=$start;$i<$next;$i++){
last if ($i > @category1);
$data = $category1[$i];
&page();
}
}

これの処理速度が遅いのですが、なにか原因はありますでしょうか?
似たような処理で下記のソースの方が、読み込む内容としては多いのですが、
こちらは普通の速度です。

sub diary2017 {
open(FILE, "<diary/diary-2017.txt") or die("error :$!");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;
&buffer();
if($start > @DATA) {$start = @DATA;}
$next = $start + 1000;
$back = $start - 1000;
if ($back < 0) { $back = 0; }
for ($i=$start;$i<$next;$i++){
last if ($i > @DATA);
$data = $DATA[$i];
&page();
}
}

カテゴリーのサブルーチンとアーカイブ専用のサブルーチンで違う点といえば
$a = 0;
my @category1 = grep(/,1,/, @DATA);
while (<@category1>) {
$a++;
}
このgrepのとこですが、
これが遅いとすると対処方法はありますか?
※開くファイルはアーカイブは直接名前にしてて、カテゴリーは変数を使ってますが
 これは同じです。

投稿日時 - 2017-04-05 15:39:47

QNo.9313693

困ってます

質問者が選んだベストアンサー

> while (<@category1>) {
>  $a++;
> }
ダイアモンド演算子 < > はファイルアクセスをするためのものなのですごく遅いですよ。

というか、そもそもこれは何をしたいのでしょう?
@category1の要素数が欲しいだけなら
my $a = @category1;
で良いです。


あと、openの書き方が古すぎです。
open(my $in, "<", $FILE)
みたいに3引数openを使いましょう。
FILEのようなベアワードのファイルハンドルも昔の書き方で、今は普通の変数が使えます。

投稿日時 - 2017-04-05 23:02:23

お礼

ありがとうございました!
処理速度が早くなりました。
ダイヤモンド演算子はファイルアクセスのため遅いのですね・・・

while (<@category1>) {
$a++;
}

ずっとこれで要素数を取得するものだと思っておりました・・・
用途は、サブルーチンpageの中に 「カテゴリーが(x)」件みたいな
使い方をしております

オープン関数が古いというご指摘もありがとうございます!
これは、勉強してからコード修正していこうかと思います。

投稿日時 - 2017-04-06 09:45:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)