[Mew-dist 08310] Re: im-111 で急に遅くなった imls
SAKAI Kiyotaka
ksakai at example.com
1999年 3月 29日 (月) 11:53:34 JST
>> In article <19990326162222L.chifumi at example.com>, Chifumi Hayashi (林 千史) <chifumi at example.com> writes:
> 下記のように im-100 に比べてやはり断然遅いです。4600件全件対象だとそれ
> ほど差はないのですが、普段 refile して g で移動して Update: 対象となる
> 数件〜数十件だと、非常に遅く感じます。
img には流しましたが、以下のパッチを当ててみて下さい。
原因は、本来は 1回しか呼ぶ必要のない重たい Folder::message_list() を複
数回呼び出してしまっていたためです。
# Mew-dist に流れた Folder.pm に関するパッチも含んでいます。
--
酒井 清隆 (E-mail: ksakai at example.com)
-------------- next part --------------
Index: Folder.pm
===================================================================
RCS file: /home/ksakai/cvsroot/im-111/IM/Folder.pm,v
retrieving revision 1.1
diff -u -r1.1 Folder.pm
--- Folder.pm 1999/03/24 08:27:27 1.1
+++ Folder.pm 1999/03/29 02:45:39
@@ -22,7 +22,7 @@
@ISA = qw(Exporter);
@EXPORT = qw(cur_folder set_cur_folder folder_info
- message_number message_range message_name
+ message_list message_number message_range message_name
get_message_paths create_folder touch_folder
chk_folder_existance chk_msg_existance get_impath);
@@ -140,7 +140,7 @@
my @filesinfolder;
opendir(DIR, $folder_dir) || im_die("can't open $folder_dir.\n");
- @filesinfolder = sort {$a <=> $b} grep(/^[1-9]\d*$/ && -f "$folder_dir/$_", readdir(DIR));
+ @filesinfolder = sort {$a <=> $b} grep(/^\d+$/ && -f "$folder_dir/$_", readdir(DIR));
closedir(DIR);
return @filesinfolder;
@@ -160,7 +160,7 @@
$folder_dir = expand_path($folder);
return '' if (!-d $folder_dir);
- @filesinfolder = message_list($folder_dir) unless defined(@filesinfolder);
+ @filesinfolder = message_list($folder_dir) if (scalar(@_) == 2);
if (scalar(@filesinfolder) == 0) {
if ($number eq 'new') {
@@ -203,9 +203,9 @@
return '';
}
-sub message_range ($$) {
- my ($folder, $range) = @_;
- my $range_regexp = '[1-9]\d*|first|last|next|prev';
+sub message_range ($$@) {
+ my ($folder, $range, @filesinfolder) = @_;
+ my $range_regexp = '\d+|first|last|next|prev';
$folder = cur_folder if ($folder eq '');
my $folder_dir = expand_path($folder);
@@ -214,8 +214,6 @@
$range = 'first-last';
}
- my @filesinfolder = message_list($folder_dir);
-
if ($range =~ /^($range_regexp|new)-($range_regexp|new)$/) {
my ($start, $end) = ($1, $2);
@@ -279,9 +277,11 @@
return ();
}
+ my @filesinfolder = message_list($folder_dir);
+
@messages = @x = ();
foreach $i (@messages0) {
- if ((@x = &message_range($folder, $i)) eq '') {
+ if ((@x = &message_range($folder, $i, @filesinfolder)) eq '') {
$@ = "message $i out of range";
return ();
}
Index: Grep.pm
===================================================================
RCS file: /home/ksakai/cvsroot/im-111/IM/Grep.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Grep.pm 1999/03/24 08:27:27 1.1
+++ Grep.pm 1999/03/24 08:56:13 1.2
@@ -16,7 +16,7 @@
use IM::Config;
use IM::Util;
-use IM::Folder qw(message_range);
+use IM::Folder qw(message_list message_range);
use IM::Japanese;
use IM::EncDec qw(mime_decode_string);
use integer;
@@ -74,12 +74,13 @@
im_debug("entered $folder_dir\n") if &debug('all');
# collect message numbers
+ my @filesinfolder = message_list($folder_dir);
foreach ( @ranges ) {
my @tmp = ();
im_die("illegal range specification: $_\n")
unless /^$range_regexp$/;
im_debug("extract range $_\n") if &debug('all');
- if (( @tmp = message_range($folder, $_)) eq '') {
+ if (( @tmp = message_range($folder, $_, @filesinfolder )) eq '') {
im_warn("message $_ out of range\n");
}
push(@src_msgs, @tmp);
Mew-dist メーリングリストの案内