all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Agustin Martin <agustin.martin@hispalinux.es>
To: Aleksey Cherepanov <aleksey.4erepanov@gmail.com>, 16800@debbugs.gnu.org
Subject: bug#16800: 24.3; flyspell works slow on very short words at the end of big file
Date: Fri, 28 Feb 2014 12:45:45 +0100	[thread overview]
Message-ID: <20140228114545.GA8669@agmartin.aq.upm.es> (raw)
In-Reply-To: <20140226203202.GA23749@agmartin.aq.upm.es>

[-- Attachment #1: Type: text/plain, Size: 1378 bytes --]

On Wed, Feb 26, 2014 at 09:32:02PM +0100, Agustin Martin wrote:
> On Mon, Feb 24, 2014 at 08:03:17PM +0400, Aleksey Cherepanov wrote:
> > I played with different (maybe wrong) implementations of
> > flyspell-word-search-backward and measured time against t.txt
> > (produced by the one-liner). All implementations are attached.
> 
> [ ... Tons of extensive and impressive debugging ... ]
> 
> > We could avoid capturing at all. And it works faster as shown by 4
> > last functions.
> 
> Hi, 
> 
> Thanks a lot for the extensive debugging and for all the suggestions. I
> have been playing with something based in your last function, but trying
> to get something more compact, see below current status
[ ... ]
> I did some efficiency test and it seemed similar to those of your efficient
> functions. Need to check further for corner cases, bugs, etc ...

Hi, Aleksey

Please find attached my first candidate for commit. Is similar to what I
sent before, but needed to add an explicit check for word at eob in
`flyspell-word-search-forward'. 

Will try to have more testing before committing. Seems to work well with the
file generated by your one-liner, even with corner cases like new
misspellings added at bob or eob, but the wider the testing the better.

Hope no one will generate files with words containing something in
OTHERCHARS.

Thanks for all your help

-- 
Agustin

[-- Attachment #2: flyspell.el_flyspell-word-search.3.diff --]
[-- Type: text/x-diff, Size: 2166 bytes --]

--- flyspell.el.orig	2014-02-26 19:05:29.651986038 +0100
+++ flyspell.el	2014-02-28 12:01:03.930010553 +0100
@@ -1048,10 +1048,21 @@
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-word-search-backward (word bound &optional ignore-case)
   (save-excursion
-    (let ((r '())
-	  (inhibit-point-motion-hooks t)
-	  p)
-      (while (and (not r) (setq p (search-backward word bound t)))
+    (let* ((r '())
+	   (inhibit-point-motion-hooks t)
+	   (flyspell-not-casechars (flyspell-get-not-casechars))
+	   (word-re (concat flyspell-not-casechars
+			    (regexp-quote word)
+			    flyspell-not-casechars))
+	   p)
+      (while
+	  (and (not r)
+	       (setq p (if (re-search-backward word-re bound t)
+			   ;; word-re match begins one char before word
+			   (progn (forward-char) (point))
+			 ;; Check above does not match similar word at b-o-b
+			 (goto-char (point-min))
+			 (search-forward word (length word) t))))
 	(let ((lw (flyspell-get-word)))
 	  (if (and (consp lw)
 		   (if ignore-case
@@ -1066,10 +1077,25 @@
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-word-search-forward (word bound)
   (save-excursion
-    (let ((r '())
-	  (inhibit-point-motion-hooks t)
-	  p)
-      (while (and (not r) (setq p (search-forward word bound t)))
+    (let* ((r '())
+	   (inhibit-point-motion-hooks t)
+	   (word-end (nth 2 (flyspell-get-word)))
+	   (flyspell-not-casechars (flyspell-get-not-casechars))
+	   (word-re (concat flyspell-not-casechars
+			    (regexp-quote word)
+			    flyspell-not-casechars))
+	   p)
+      (while
+	  (and (not r)
+	       (setq p (if (= word-end (point-max))
+			   nil ;; Current word is at e-o-b. No forward search
+			 (if (re-search-forward word-re bound t)
+			     ;; word-re match ends one char after word
+			     (progn (backward-char) (point))
+			   ;; Check above does not match similar word at e-o-b
+			   (goto-char (point-max))
+			   (search-backward word (- (point-max)
+						    (length word)) t)))))
 	(let ((lw (flyspell-get-word)))
 	  (if (and (consp lw) (string-equal (car lw) word))
 	      (setq r p)

  reply	other threads:[~2014-02-28 11:45 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-18 20:56 bug#16800: 24.3; flyspell works slow on very short words at the end of big file Aleksey Cherepanov
2014-02-21 10:15 ` Eli Zaretskii
2014-02-21 14:38   ` Agustin Martin
2014-02-21 15:12     ` Eli Zaretskii
2014-02-21 15:21       ` Eli Zaretskii
2014-02-22 12:44       ` Aleksey Cherepanov
2014-02-22 13:10         ` Eli Zaretskii
2014-02-22 16:02           ` Aleksey Cherepanov
2014-02-22 16:41             ` Eli Zaretskii
2014-02-22 18:55               ` Aleksey Cherepanov
2014-02-22 20:16                 ` Aleksey Cherepanov
2014-02-22 21:03                 ` Eli Zaretskii
2014-02-23  1:26                   ` Agustin Martin
2014-02-23 18:36                     ` Eli Zaretskii
2014-02-23 19:56                     ` Aleksey Cherepanov
2014-02-23 23:02                       ` Aleksey Cherepanov
2014-02-24 16:03                         ` Aleksey Cherepanov
2014-02-26 20:32                           ` Agustin Martin
2014-02-28 11:45                             ` Agustin Martin [this message]
2014-02-28 11:51                               ` Eli Zaretskii
2014-03-01 21:44                                 ` Aleksey Cherepanov
2014-03-02  3:56                                   ` Eli Zaretskii
2014-03-09 17:36                                     ` Agustin Martin
2014-03-09 18:02                                       ` Aleksey Cherepanov
2014-03-09 18:24                                         ` Eli Zaretskii
2014-02-28 23:11                               ` Aleksey Cherepanov
2014-03-01 10:33                                 ` Aleksey Cherepanov
2014-03-01 15:50                                   ` Aleksey Cherepanov
2014-03-01 21:39                                 ` Aleksey Cherepanov
2014-03-09 17:25                                 ` Agustin Martin
2015-03-06 21:46                                   ` Agustin Martin
2015-03-07  8:09                                     ` Eli Zaretskii
2014-02-23 20:39                     ` Aleksey Cherepanov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140228114545.GA8669@agmartin.aq.upm.es \
    --to=agustin.martin@hispalinux.es \
    --cc=16800@debbugs.gnu.org \
    --cc=aleksey.4erepanov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.