作者: dune
日時: 2002/10/01(03:45)
極悪です。

閑舎 さんの [TSperl:188] Re: txtsearchver.0.63が異様に遅い……。 から
>>   open(IN, "$FILE") or die;
>>   binmode(IN);
>>   $LINE = $buff = "";
>>   while (read(IN, $buff, 8192)) {
>>     $LINE .= $buff;
>>   }
>>   read(IN, $LINE, 99999999);
>>   close(IN);
>> 
>> に代えると、さっと終るようです(ノートでなく、VMware 上の WinXP での確
>> 認)。
>
>度々すみません。おわかりでしょうが、上のコードで
>
>  read(IN, $LINE, 99999999);
>
>の 1 行は削除してお読みください。カットアンドペーストの消し忘れです(^^;。

了解。

それにしても read で読むバイト数の最適値ってどうやって決まる
のでしょう。ハードディスクのクラスタとかセクタサイズがからん
でそうな気はしますが。

8192byte だと一気読みしたのと同じくらいのパフォーマンス、
99999999byte だと 1.5〜2 倍近く速い。1byte とかやると当然、
話にならないくらい時間がかかる。



--^hoge.pl
my $file    = shift or die;
my $size    = shift;
my $buff;

open(FILE,$file) or die $!;
binmode FILE;
if($size){
    while(read(FILE,$_,$size)){
        $buff   .= $_;
    }
}else{
    $/  = "";
    $buff   = <FILE>;
}
close FILE;

print int((length $buff)/1024/1024),"MB\n";
print time - $^T,"s\n";
--$



以下テキトーに試してます。

D:%perl hoge.pl D:\PDF\00legend.txt
175MB
46s

D:%perl hoge.pl D:\PDF\00legend.txt
175MB
42s

D:%perl hoge.pl D:\PDF\00legend.txt 8192
175MB
43s

D:%perl hoge.pl D:\PDF\00legend.txt 8192
175MB
45s

D:%perl hoge.pl D:\PDF\00legend.txt
175MB
45s

D:%perl hoge.pl D:\PDF\00legend.txt 8192
175MB
41s

D:%perl hoge.pl D:\PDF\00legend.txt 99999999
175MB
33s

D:%perl hoge.pl D:\PDF\00legend.txt 99999999
175MB
21s

D:%perl hoge.pl D:\PDF\00legend.txt 99999999
175MB
21s

D:%perl hoge.pl D:\PDF\00legend.txt
175MB
41s

D:%

# あぁ、ハードディスクがゴリゴリ鳴る…
-- 
FZH01112@..., http://homepage1.nifty.com/dune/