[mew-dist 22256] accelerating by-folder

Kazu Yamamoto ( 山本和彦 ) kazu at example.com
2002年 11月 12日 (火) 21:33:50 JST


リリース前というのにスピード狂の虫が騒ぎました。(うそ)

refile の guess-by-folder が、かんべんならないぐらい遅いことに気付いた
瞬間に、高速化のアイディアが湧いてしまいました。

mew-local-folder-alist は、("+foo/bar" "bar") のようなエントリのリスト
になっています。エントリは増える予定はないので、これを 
("+foo/bar" . "bar") のリスト、つまり alist にすれば、組み込み関数であ
る rassoc が使えます。

Elisp で while を回す方法とは比較にならないぐらい速いです。

(("+foo/" "foo") ("+foo/foo" "foo")) のときは、後者にマッチすべきです
が、rassoc では前者にマッチします。しかし、これも解決してしまいました。
(だから、Lisp は好きなの)

という訳で、冒険家 AND ローカルフォルダを使っている人は、以下のパッチ
を当てみて下さい。一回だけ、"1Z" して mew-local-folder-alist を作り変
えましょう。refile が劇的に速くなります。

もし、このようなデータ構造の変更が許されるなら、リモートフォルダに対し
ても適応します。データ構造を変更するなら、今がチャンス。「やめとけ」と
いう意見も受け入れます。

なお、このパッチを当るとフォルダには大文字が使えなくなります。これも考
慮して意見を言って頂けると嬉しいです。

--かず

Index: mew-func.el
===================================================================
RCS file: /cvsroot/mew/mew/mew-func.el,v
retrieving revision 1.104
diff -c -F^( -r1.104 mew-func.el
*** mew-func.el	2002/11/11 09:07:46	1.104
--- mew-func.el	2002/11/12 12:34:30
*************** (defun mew-assoc-case-equal (key alist n
*** 160,178 ****
  	(setq alist (cdr alist))))))
  
  (defun mew-assoc-folder (key alist localp)
!   (let ((skey (downcase key))
! 	(regex (concat mew-path-separator "$"))
! 	a n ret)
!     (catch 'loop
!       (while alist
! 	(setq a (car alist))
! 	(setq n (nth 1 a))
! 	(when (and (stringp n) (string= (downcase n) skey))
! 	  (setq ret a)
! 	  (unless (and localp (string-match regex (car a)))
! 	    (throw 'loop nil)))
! 	(setq alist (cdr alist))))
!     ret))
  
  (defun mew-assoc-match (key alist nth)
    "Return list in ALIST that KEY regex is matched to its NTH element.
--- 160,176 ----
  	(setq alist (cdr alist))))))
  
  (defun mew-assoc-folder (key alist localp)
!   (let ((skey (downcase key)) ret ret2 regex)
!     (if (not localp)
! 	(rassoc skey alist)
!       ;; ("+foo/" . "foo")
!       ;; ("+foo/foo" . "foo")
!       (setq regex (concat mew-path-separator "$"))
!       (setq ret (rassoc skey alist))
!       (when (and ret (string-match regex (car ret)))
! 	(setq alist (cdr (member ret alist)))
! 	(setq ret2 (rassoc skey alist)))
!       (or ret2 ret))))
  
  (defun mew-assoc-match (key alist nth)
    "Return list in ALIST that KEY regex is matched to its NTH element.
Index: mew-local.el
===================================================================
RCS file: /cvsroot/mew/mew/mew-local.el,v
retrieving revision 1.55
diff -c -F^( -r1.55 mew-local.el
*** mew-local.el	2002/11/09 05:32:18	1.55
--- mew-local.el	2002/11/12 12:34:30
*************** (defun mew-dir-list-without-link-count (
*** 82,88 ****
  (defun mew-local-folder-entry (ent1 ent2 make-list)
    (if make-list
        ent1
!     (list ent1 ent2)))
  
  (defun mew-local-folder-make-alist (dirs prefix &optional make-list)
    (let (fldpfx dir ret ent)
--- 82,88 ----
  (defun mew-local-folder-entry (ent1 ent2 make-list)
    (if make-list
        ent1
!     (cons ent1 ent2)))
  
  (defun mew-local-folder-make-alist (dirs prefix &optional make-list)
    (let (fldpfx dir ret ent)
*************** (defun mew-local-folder-pair (folder)
*** 178,185 ****
  	 ;; foo/bar -> bar 
  	 ;; foo -> foo
      (if (string-match mew-regex-ignore-folders folder)
! 	(list folder nil)
!       (list folder subdir))))
  
  (defun mew-local-folder-insert (folder)
    "Insert FOLDER to 'mew-local-folder-alist'.
--- 178,185 ----
  	 ;; foo/bar -> bar 
  	 ;; foo -> foo
      (if (string-match mew-regex-ignore-folders folder)
! 	(cons folder nil)
!       (cons folder subdir))))
  
  (defun mew-local-folder-insert (folder)
    "Insert FOLDER to 'mew-local-folder-alist'.




Mew-dist メーリングリストの案内