* with-case-table in nnfolder.el
@ 2007-04-15 10:19 Reiner Steib
0 siblings, 0 replies; only message in thread
From: Reiner Steib @ 2007-04-15 10:19 UTC (permalink / raw)
To: ding
[-- Attachment #1: Type: text/plain, Size: 810 bytes --]
Hi,
the case conversion in Emacs 22 makes large nnfolder groups very slow
if the user has a Turkish locale because of the Turkish case
conversion of `i' and `I' into `İ' and `ı'
(cf. `turkish-case-conversion-enable').
[ See
http://thread.gmane.org/gmane.emacs.devel/68859/focus=64496
http://thread.gmane.org/gmane.emacs.gnus.general/63925/focus=63979
for more information. ]
The following patch should fix this slowness. But I don't use
nnfolder myself and I don't have much time for testing, so I hesitate
to install it (even in the trunk). Could someone please review the
patch and/or test it, please?
To change your locale to Turkish temporarily, you can start Emacs
using "LC_CTYPE=tr_TR emacs -f gnus". But also testing it with your
usual locale if you are using nnfolder would be useful.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: rs-nnfolder-search-marker-2007-04-15.patch --]
[-- Type: text/x-patch, Size: 6549 bytes --]
--- nnfolder.el 26 Jan 2007 20:41:00 +0100 7.17
+++ nnfolder.el 15 Apr 2007 12:14:43 +0200
@@ -104,6 +104,37 @@
(defconst nnfolder-article-marker "X-Gnus-Article-Number: "
"String used to demarcate what the article number for a message is.")
+;; Make sure we're using the standard case table. In a Turkish locale, the
+;; "i" in "X-Gnus-Article-Number: " (cf. `turkish-case-conversion-enable')
+;; makes parsing large nnfolder groups very slow.
+;; ,----[ http://thread.gmane.org/gmane.emacs.gnus.general/63925/focus=63979 ]
+;; | Subject: Slow operations on buffers of tens of megabytes
+;; | Newsgroups: gmane.emacs.pretest.bugs,gmane.emacs.gnus.general
+;; | Date: 2006-11-13
+;; `----
+(defun nnfolder-search (&optional function string &rest args)
+ "Search for `nnfolder-article-marker' using the standard case table.
+FUNCTION is used for searching. If STRING is given, it's used
+instead of `nnfolder-article-marker'. The remaining ARGS are
+passed to the FUNCTION."
+ (setq function (cond ((fboundp function)
+ function)
+ (function
+ 'search-backward)
+ (t
+ 'search-forward)))
+ (unless string
+ (setq string (concat "\n" nnfolder-article-marker)))
+ (if (and (fboundp 'with-case-table)
+ (boundp 'ascii-case-table))
+ ;; Emacs 22+
+ (with-case-table ascii-case-table
+ (apply function string))
+ ;; In Emacs 21 (and XEmacs) `with-case-table' and `ascii-case-table' are
+ ;; not available, but no wrapping is required because those Emacsen don't
+ ;; convert "i" specialy even in a Turkish locale.
+ (apply function string)))
+
(defvoo nnfolder-current-group nil)
(defvoo nnfolder-current-buffer nil)
(defvoo nnfolder-status-string "")
@@ -198,8 +229,7 @@
;; as caused by active file bogosity.
(cond
((bobp))
- ((search-backward (concat "\n" nnfolder-article-marker)
- nil t)
+ ((nnfolder-search 'search-backward nil nil t)
(goto-char (match-end 0))
(setq num (string-to-number
(buffer-substring
@@ -208,8 +238,7 @@
(< num article)))
;; Check that we are before an article with a
;; higher number.
- (search-forward (concat "\n" nnfolder-article-marker)
- nil t)
+ (nnfolder-search 'search-forward nil nil t)
(progn
(setq num (string-to-number
(buffer-substring
@@ -284,8 +313,7 @@
(cons nnfolder-current-group article)
(goto-char (point-min))
(cons nnfolder-current-group
- (if (search-forward (concat "\n" nnfolder-article-marker)
- nil t)
+ (if (nnfolder-search 'search-forward nil nil t)
(string-to-number (buffer-substring
(point) (point-at-eol)))
-1))))))))
@@ -405,10 +433,9 @@
(when nnfolder-current-buffer
(set-buffer nnfolder-current-buffer)
(goto-char (point-min))
- (let ((marker (concat "\n" nnfolder-article-marker))
- (number "[0-9]+")
+ (let ((number "[0-9]+")
numbers)
- (while (and (search-forward marker nil t)
+ (while (and (nnfolder-search 'search-forward nil nil t)
(re-search-forward number nil t))
(let ((newnum (string-to-number (match-string 0))))
(if (nnmail-within-headers-p)
@@ -436,8 +463,7 @@
(while (and maybe-expirable is-old)
(goto-char (point-min))
(when (and (nnfolder-goto-article (car maybe-expirable))
- (search-forward (concat "\n" nnfolder-article-marker)
- nil t))
+ (nnfolder-search 'search-forward nil nil t))
(forward-sexp)
(when (setq is-old
(nnmail-expired-article-p
@@ -480,8 +506,7 @@
(erase-buffer)
(insert-buffer-substring nntp-server-buffer)
(goto-char (point-min))
- (while (re-search-forward
- (concat "^" nnfolder-article-marker)
+ (while (nnfolder-search 're-search-forward nil
(save-excursion (and (search-forward "\n\n" nil t) (point)))
t)
(gnus-delete-line))
@@ -523,7 +548,9 @@
(if (search-forward "\n\n" nil t)
(forward-line -1)
(goto-char (point-max)))
- (while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
+ (while (nnfolder-search 're-search-backward
+ (concat "^" nnfolder-article-marker)
+ nil t)
(delete-region (point) (progn (forward-line 1) (point))))
(when nnmail-cache-accepted-message-ids
(nnmail-cache-insert (nnmail-fetch-field "message-id")
@@ -642,13 +669,12 @@
(defun nnfolder-adjust-min-active (group)
;; Find the lowest active article in this group.
(let* ((active (cadr (assoc group nnfolder-group-alist)))
- (marker (concat "\n" nnfolder-article-marker))
(number "[0-9]+")
(activemin (cdr active)))
(save-excursion
(set-buffer nnfolder-current-buffer)
(goto-char (point-min))
- (while (and (search-forward marker nil t)
+ (while (and (nnfolder-search 'search-forward nil nil t)
(re-search-forward number nil t))
(let ((newnum (string-to-number (match-string 0))))
(if (nnmail-within-headers-p)
@@ -788,7 +814,7 @@
(if (search-forward "\n\n" nil t)
(forward-line -1)
(goto-char (point-max)))
- (while (search-backward (concat "\n" nnfolder-article-marker) nil t)
+ (while (nnfolder-search 'search-backward nil nil t)
(delete-region (1+ (point)) (progn (forward-line 2) (point))))
;; Insert the new newsgroup marker.
@@ -894,7 +920,6 @@
(nnmail-activate 'nnfolder)
;; Read in the file.
(let ((delim "^From ")
- (marker (concat "\n" nnfolder-article-marker))
(number "[0-9]+")
(active (or (cadr (assoc group nnfolder-group-alist))
(cons 1 0)))
@@ -928,7 +953,7 @@
(when (or nnfolder-ignore-active-file
novbuf
(< maxid 2))
- (while (and (search-forward marker nil t)
+ (while (and (nnfolder-search 'search-forward nil nil t)
(looking-at number))
(setq newnum (string-to-number (match-string 0)))
(when (nnmail-within-headers-p)
@@ -959,7 +984,7 @@
(when (not (or nnfolder-distrust-mbox
(< maxid 2)))
(goto-char (point-max))
- (unless (re-search-backward marker nil t)
+ (unless (nnfolder-search 're-search-backward nil nil t)
(goto-char (point-min)))
;;(when (nnmail-search-unix-mail-delim)
;; (goto-char (point-min)))
@@ -982,7 +1007,7 @@
(point)
(point-max)))
(goto-char start)
- (when (not (search-forward marker end t))
+ (when (not (nnfolder-search 'search-forward nil end t))
(narrow-to-region start end)
(nnmail-insert-lines)
(nnfolder-insert-newsgroup-line
[-- Attachment #3: Type: text/plain, Size: 114 bytes --]
Bye, Reiner.
--
,,,
(o o)
---ooO-(_)-Ooo--- | PGP key available | http://rsteib.home.pages.de/
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-04-15 10:19 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-04-15 10:19 with-case-table in nnfolder.el Reiner Steib
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).