[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 メーリングリストの案内