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