unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
@ 2019-09-12 17:07 Simen Heggestøyl
  2019-09-12 17:46 ` Stefan Monnier
  0 siblings, 1 reply; 15+ messages in thread
From: Simen Heggestøyl @ 2019-09-12 17:07 UTC (permalink / raw)
  To: 37393; +Cc: Stefan Monnier, Leo Liu

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


The attached patch attempts to speed up the 'csv-align-fields' command
by avoiding expensive calls to 'current-column', instead reusing field
widths already computed by 'csv--column-widths'.

I felt an urge to speed up the command a bit while working with large
(100 000+ lines) CSV files. Below are benchmarks produced by running

  (benchmark 3 '(csv-align-fields nil (point-min) (point-max)))

in three CSV files from the real world of various sizes. In these cases
the speedup seems to be around 1.5x—2x.

~400 line file:
  Before: Elapsed time: 0.175867s
  After:  Elapsed time: 0.086809s

~50 000 line file:
  Before: Elapsed time: 34.665853s (7.480686s in 35 GCs)
  After:  Elapsed time: 24.349081s (7.154716s in 27 GCs)

~110 000 line file:
  Before: Elapsed time: 82.444038s (19.799686s in 51 GCs)
  After:  Elapsed time: 40.184331s (9.037813s in 25 GCs)

(I've put on CC the two of you who seem to have done most of the work on
this mode lately, hope that's OK.)

-- Simen

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Speed-up-csv-align-fields.patch --]
[-- Type: text/x-diff, Size: 3851 bytes --]

From 4fc82f1f66c736bcfbc15d20ff53bd3e21e8a8e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simen=20Heggest=C3=B8yl?= <simenheg@gmail.com>
Date: Thu, 12 Sep 2019 18:54:28 +0200
Subject: [PATCH] Speed up 'csv-align-fields'

* packages/csv-mode/csv-mode.el: Bump version number and make the
dependency on Emacs 24.1 or higher explicit.
(csv--column-widths): Return the field widths as well.
(csv-align-fields): Speed up by using the field widths already computed
by 'csv--column-widths'.
---
 packages/csv-mode/csv-mode.el | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/packages/csv-mode/csv-mode.el b/packages/csv-mode/csv-mode.el
index 40f70330a..dc2555687 100644
--- a/packages/csv-mode/csv-mode.el
+++ b/packages/csv-mode/csv-mode.el
@@ -4,7 +4,8 @@
 
 ;; Author: "Francis J. Wright" <F.J.Wright@qmul.ac.uk>
 ;; Time-stamp: <23 August 2004>
-;; Version: 1.7
+;; Version: 1.8
+;; Package-Requires: ((emacs "24.1"))
 ;; Keywords: convenience
 
 ;; This package is free software; you can redistribute it and/or modify
@@ -969,24 +970,26 @@ The fields yanked are those last killed by `csv-kill-fields'."
   (and (overlay-get o 'csv) (delete-overlay o)))
 
 (defun csv--column-widths ()
-  (let ((widths '()))
+  (let ((column-widths '())
+        (field-widths '()))
     ;; Construct list of column widths:
     (while (not (eobp))                   ; for each record...
       (or (csv-not-looking-at-record)
-          (let ((w widths)
+          (let ((w column-widths)
                 (col (current-column))
-                x)
+                field-width)
             (while (not (eolp))
               (csv-end-of-field)
-              (setq x (- (current-column) col)) ; Field width.
+              (setq field-width (- (current-column) col))
+              (push field-width field-widths)
               (if w
-                  (if (> x (car w)) (setcar w x))
-                (setq w (list x)
-                      widths (nconc widths w)))
+                  (if (> field-width (car w)) (setcar w field-width))
+                (setq w (list field-width)
+                      column-widths (nconc column-widths w)))
               (or (eolp) (forward-char))  ; Skip separator.
               (setq w (cdr w) col (current-column)))))
       (forward-line))
-    widths))
+    (list column-widths (nreverse field-widths))))
 
 (defun csv-align-fields (hard beg end)
   "Align all the fields in the region to form columns.
@@ -1017,23 +1020,22 @@ If there is no selected region, default to the whole buffer."
       (narrow-to-region beg end)
       (set-marker end nil)
       (goto-char (point-min))
-      (let ((widths (csv--column-widths)))
+      (pcase-let ((`(,column-widths ,field-widths) (csv--column-widths)))
 
 	;; Align fields:
 	(goto-char (point-min))
 	(while (not (eobp))		; for each record...
 	  (unless (csv-not-looking-at-record)
-            (let ((w widths)
+            (let ((w column-widths)
                   (column 0))    ;Desired position of left-side of this column.
               (while (and w (not (eolp)))
                 (let* ((beg (point))
                        (align-padding (if (bolp) 0 csv-align-padding))
                        (left-padding 0) (right-padding 0)
-                       (field-width
-                        (- (- (current-column)
-                              (progn (csv-end-of-field) (current-column)))))
+                       (field-width (pop field-widths))
                        (column-width (pop w))
                        (x (- column-width field-width))) ; Required padding.
+                  (csv-end-of-field)
                   (set-marker end (point)) ; End of current field.
                   ;; beg = beginning of current field
                   ;; end = (point) = end of current field
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-12 17:07 bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields' Simen Heggestøyl
@ 2019-09-12 17:46 ` Stefan Monnier
  2019-09-15 15:55   ` Simen Heggestøyl
  0 siblings, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2019-09-12 17:46 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, sdl.web

> The attached patch attempts to speed up the 'csv-align-fields' command
> by avoiding expensive calls to 'current-column', instead reusing field
> widths already computed by 'csv--column-widths'.

Sounds good.  I rarely use large CSV files, but I know the operation is slow.

I'm OK with the patch, tho please see my comment below.

> I felt an urge to speed up the command a bit while working with large
> (100 000+ lines) CSV files. Below are benchmarks produced by running
>
>   (benchmark 3 '(csv-align-fields nil (point-min) (point-max)))
>
> in three CSV files from the real world of various sizes. In these cases
> the speedup seems to be around 1.5x—2x.
>
> ~400 line file:
>   Before: Elapsed time: 0.175867s
>   After:  Elapsed time: 0.086809s
>
> ~50 000 line file:
>   Before: Elapsed time: 34.665853s (7.480686s in 35 GCs)
>   After:  Elapsed time: 24.349081s (7.154716s in 27 GCs)
>
> ~110 000 line file:
>   Before: Elapsed time: 82.444038s (19.799686s in 51 GCs)
>   After:  Elapsed time: 40.184331s (9.037813s in 25 GCs)

40s is still slow, but a factor of 2 is good, thanks.

If you're interested in this line, I think there are two avenues to
improve the behavior further:
- align lazily via jit-lock (this way the time is determined by the
  amount of text displayed rather than the total file size).
- make align-fields' into a mode, where fields are kept aligned even while
  the buffer is modified.

>  (defun csv--column-widths ()
> -  (let ((widths '()))
> +  (let ((column-widths '())
> +        (field-widths '()))

I think the return value is now sufficiently complex that the function
deserves a docstring describing it.


        Stefan






^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-12 17:46 ` Stefan Monnier
@ 2019-09-15 15:55   ` Simen Heggestøyl
  2019-09-15 16:17     ` Eli Zaretskii
  2019-09-15 18:43     ` Stefan Monnier
  0 siblings, 2 replies; 15+ messages in thread
From: Simen Heggestøyl @ 2019-09-15 15:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 37393, sdl.web

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

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Sounds good.  I rarely use large CSV files, but I know the operation is slow.
>
> I'm OK with the patch, tho please see my comment below.

Thanks for reviewing it.

> 40s is still slow, but a factor of 2 is good, thanks.

Yes (though 40s is the time for all three benchmark runs, so one
alignment is 40s/3).

> If you're interested in this line, I think there are two avenues to
> improve the behavior further:
> - align lazily via jit-lock (this way the time is determined by the
>   amount of text displayed rather than the total file size).

Wouldn't that still depend on knowing the column widths? I find that the
column width computation is taking about 80% of the time when calling
'csv-align-fields' (after the patch).

> - make align-fields' into a mode, where fields are kept aligned even while
>   the buffer is modified.

That sounds nice.

>>  (defun csv--column-widths ()
>> -  (let ((widths '()))
>> +  (let ((column-widths '())
>> +        (field-widths '()))
>
> I think the return value is now sufficiently complex that the function
> deserves a docstring describing it.

Agreed, I'll add one before I install the patch.

I've also attached a new suggestion for speeding up the column width
computation itself by eliminating another 'current-column'-call. I'm not
too sure about its correctness yet, but it seems to work in a few tests
I've done, and it sped up 'csv--column-widths' by a factor of 1.3–1.4.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-WIP.patch --]
[-- Type: text/x-diff, Size: 1948 bytes --]

From c3c077170aefa8ba0cd5d8f8b824c85eb0f01a66 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simen=20Heggest=C3=B8yl?= <simenheg@gmail.com>
Date: Sun, 15 Sep 2019 17:31:40 +0200
Subject: [PATCH] WIP

---
 packages/csv-mode/csv-mode.el | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/packages/csv-mode/csv-mode.el b/packages/csv-mode/csv-mode.el
index dc2555687..00107f51e 100644
--- a/packages/csv-mode/csv-mode.el
+++ b/packages/csv-mode/csv-mode.el
@@ -976,18 +976,26 @@ The fields yanked are those last killed by `csv-kill-fields'."
     (while (not (eobp))                   ; for each record...
       (or (csv-not-looking-at-record)
           (let ((w column-widths)
-                (col (current-column))
+                (col-beg (current-column))
+                col-end
                 field-width)
             (while (not (eolp))
               (csv-end-of-field)
-              (setq field-width (- (current-column) col))
+              (setq col-end (current-column))
+              (setq field-width (- col-end col-beg))
               (push field-width field-widths)
               (if w
                   (if (> field-width (car w)) (setcar w field-width))
                 (setq w (list field-width)
                       column-widths (nconc column-widths w)))
-              (or (eolp) (forward-char))  ; Skip separator.
-              (setq w (cdr w) col (current-column)))))
+              (unless (eolp)
+                (forward-char)            ; Skip separator.
+                (setq w (cdr w))
+                (setq col-beg (if (= (char-before) ?\t)
+                                  (* (/ (+ col-end tab-width)
+                                        tab-width)
+                                     tab-width)
+                                (+ col-end (char-width (char-before)))))))))
       (forward-line))
     (list column-widths (nreverse field-widths))))
 
-- 
2.23.0


[-- Attachment #3: Type: text/plain, Size: 9 bytes --]

-- Simen

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-15 15:55   ` Simen Heggestøyl
@ 2019-09-15 16:17     ` Eli Zaretskii
  2019-09-15 18:43     ` Stefan Monnier
  1 sibling, 0 replies; 15+ messages in thread
From: Eli Zaretskii @ 2019-09-15 16:17 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, monnier, sdl.web

> From: Simen Heggestøyl <simenheg@gmail.com>
> Date: Sun, 15 Sep 2019 17:55:44 +0200
> Cc: 37393@debbugs.gnu.org, sdl.web@gmail.com
> 
> > If you're interested in this line, I think there are two avenues to
> > improve the behavior further:
> > - align lazily via jit-lock (this way the time is determined by the
> >   amount of text displayed rather than the total file size).
> 
> Wouldn't that still depend on knowing the column widths? I find that the
> column width computation is taking about 80% of the time when calling
> 'csv-align-fields' (after the patch).

I'm talking here about something I don't understand well enough, but
did you try computing column width using vertical-motion?





^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-15 15:55   ` Simen Heggestøyl
  2019-09-15 16:17     ` Eli Zaretskii
@ 2019-09-15 18:43     ` Stefan Monnier
  2019-09-17 16:53       ` Simen Heggestøyl
  1 sibling, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2019-09-15 18:43 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, sdl.web

>> If you're interested in this line, I think there are two avenues to
>> improve the behavior further:
>> - align lazily via jit-lock (this way the time is determined by the
>>   amount of text displayed rather than the total file size).
> Wouldn't that still depend on knowing the column widths?

Of the whole file?  No: instead you'd only use the max of the columns that
you've seen so far.  When it increases (thus invalidating
alignment-overlays already created), you just "flush" those overlays and
rebuild them.

> I've also attached a new suggestion for speeding up the column width
> computation itself by eliminating another 'current-column'-call. I'm not
> too sure about its correctness yet, but it seems to work in a few tests
> I've done, and it sped up 'csv--column-widths' by a factor of 1.3–1.4.

Looks OK, but deserves a comment explaining that this computation of the
new `col-beg` using tab-width and char-width is there to avoid an
additional call to current-column (it's basically
a "fast-current-column" which gets its extra speed from doing the work
more incrementally, whereas current-column always starts counting from
BOL).

Maybe we could get yet more speedup by making it possible to pass to
`current-column` (or a new C function) a start position along with its
column, so we'd avoid re-traversing the part of the line that we've
already processed.


        Stefan






^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-15 18:43     ` Stefan Monnier
@ 2019-09-17 16:53       ` Simen Heggestøyl
  2019-09-17 17:23         ` Eli Zaretskii
  2019-09-17 19:12         ` Stefan Monnier
  0 siblings, 2 replies; 15+ messages in thread
From: Simen Heggestøyl @ 2019-09-17 16:53 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: 37393, sdl.web

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

Eli Zaretskii <eliz@gnu.org> writes:

> I'm talking here about something I don't understand well enough, but
> did you try computing column width using vertical-motion?

No, I haven't yet tried anything in that direction.

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>>> If you're interested in this line, I think there are two avenues to
>>> improve the behavior further:
>>> - align lazily via jit-lock (this way the time is determined by the
>>>   amount of text displayed rather than the total file size).
>> Wouldn't that still depend on knowing the column widths?
>
> Of the whole file?  No: instead you'd only use the max of the columns that
> you've seen so far.  When it increases (thus invalidating
> alignment-overlays already created), you just "flush" those overlays and
> rebuild them.

Wouldn't then the columns appear to jump about whenever a new max width
is discovered? I also guess you'd lose the ability to do e.g.
C-u 1000 C-n and stay in the same column?

> Maybe we could get yet more speedup by making it possible to pass to
> `current-column` (or a new C function) a start position along with its
> column, so we'd avoid re-traversing the part of the line that we've
> already processed.

I think that sounds like a good idea; then my ugly "fast-current-column"
patch from last time won't be needed. I have no prior experience with
Emacs' C internals, but an initial naive attempt is attached. I've only
tested it on some basic cases where it seems to behave correctly and
gives a speedup factor of around 4,5x–5x. Could this track be something
worth exploring further?

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-WIP.patch --]
[-- Type: text/x-diff, Size: 2519 bytes --]

From 16d8915b8ad96b2aa7fb0350468b4af847c5ff19 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simen=20Heggest=C3=B8yl?= <simenheg@gmail.com>
Date: Tue, 17 Sep 2019 17:32:00 +0200
Subject: [PATCH] WIP

---
 src/indent.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/indent.c b/src/indent.c
index 1b589a710c..f2c525d882 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -46,6 +46,10 @@ #define CR 015
 
 ptrdiff_t last_known_column_point;
 
+/* Value of point byte when current_column was called.  */
+
+ptrdiff_t last_known_column_point_byte;
+
 /* Value of MODIFF when current_column was called.  */
 
 static modiff_count last_known_column_modified;
@@ -325,6 +329,7 @@ DEFUN ("current-column", Fcurrent_column, Scurrent_column, 0, 0, 0,
 invalidate_current_column (void)
 {
   last_known_column_point = 0;
+  last_known_column_point_byte = 0;
 }
 
 ptrdiff_t
@@ -454,6 +459,7 @@ current_column (void)
 
   last_known_column = col;
   last_known_column_point = PT;
+  last_known_column_point_byte = PT_BYTE;
   last_known_column_modified = MODIFF;
 
   return col;
@@ -545,6 +551,17 @@ scan_for_column (ptrdiff_t *endpos, EMACS_INT *goalcol, ptrdiff_t *prevcol)
   ptrdiff_t scan, scan_byte, next_boundary;
 
   scan = find_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, -1, NULL, &scan_byte, 1);
+
+  if (scan < last_known_column_point
+      && end > last_known_column_point
+      && MODIFF == last_known_column_modified)
+    {
+      scan = last_known_column_point;
+      scan_byte = last_known_column_point_byte;
+      col = last_known_column;
+      prev_col = last_known_column;
+    }
+
   next_boundary = scan;
 
   window = Fget_buffer_window (Fcurrent_buffer (), Qnil);
@@ -701,6 +718,7 @@ scan_for_column (ptrdiff_t *endpos, EMACS_INT *goalcol, ptrdiff_t *prevcol)
 
   last_known_column = col;
   last_known_column_point = PT;
+  last_known_column_point_byte = PT_BYTE;
   last_known_column_modified = MODIFF;
 
   if (goalcol)
@@ -848,6 +866,7 @@ DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ",
 
   last_known_column = mincol;
   last_known_column_point = PT;
+  last_known_column_point_byte = PT_BYTE;
   last_known_column_modified = MODIFF;
 
   XSETINT (column, mincol);
@@ -1040,6 +1059,7 @@ COLUMN (otherwise).  In addition, if FORCE is t, and the line is too short
 
   last_known_column = col;
   last_known_column_point = PT;
+  last_known_column_point_byte = PT_BYTE;
   last_known_column_modified = MODIFF;
 
   return make_fixnum (col);
-- 
2.23.0


[-- Attachment #3: Type: text/plain, Size: 9 bytes --]

-- Simen

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-17 16:53       ` Simen Heggestøyl
@ 2019-09-17 17:23         ` Eli Zaretskii
  2019-09-17 19:14           ` Stefan Monnier
  2019-09-17 19:12         ` Stefan Monnier
  1 sibling, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2019-09-17 17:23 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, monnier, sdl.web

> From: Simen Heggestøyl <simenheg@gmail.com>
> Cc: 37393@debbugs.gnu.org, sdl.web@gmail.com
> Date: Tue, 17 Sep 2019 18:53:06 +0200
> 
> > Maybe we could get yet more speedup by making it possible to pass to
> > `current-column` (or a new C function) a start position along with its
> > column, so we'd avoid re-traversing the part of the line that we've
> > already processed.
> 
> I think that sounds like a good idea; then my ugly "fast-current-column"
> patch from last time won't be needed.

Once again, risking to talk about something I don't clearly
understand: vertical-motion already allows you to pass an argument
which tells what is the current column.

Any rationale to use current-column instead of vertical-motion?





^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-17 16:53       ` Simen Heggestøyl
  2019-09-17 17:23         ` Eli Zaretskii
@ 2019-09-17 19:12         ` Stefan Monnier
  1 sibling, 0 replies; 15+ messages in thread
From: Stefan Monnier @ 2019-09-17 19:12 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, sdl.web

>> Of the whole file?  No: instead you'd only use the max of the columns that
>> you've seen so far.  When it increases (thus invalidating
>> alignment-overlays already created), you just "flush" those overlays and
>> rebuild them.
> Wouldn't then the columns appear to jump about whenever a new max width
> is discovered?

Yes, but that should only happen as part of a scroll or similar
"significant" visual change anyway.

> I also guess you'd lose the ability to do e.g.
> C-u 1000 C-n and stay in the same column?

Probably, yes.  Seems like a minor issue to me.

>> Maybe we could get yet more speedup by making it possible to pass to
>> `current-column` (or a new C function) a start position along with its
>> column, so we'd avoid re-traversing the part of the line that we've
>> already processed.
> I think that sounds like a good idea; then my ugly "fast-current-column"

> Could this track be something worth exploring further?

Your call,


        Stefan






^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-17 17:23         ` Eli Zaretskii
@ 2019-09-17 19:14           ` Stefan Monnier
  2019-09-18  2:34             ` Eli Zaretskii
  0 siblings, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2019-09-17 19:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 37393, Simen Heggestøyl, sdl.web

> Once again, risking to talk about something I don't clearly
> understand: vertical-motion already allows you to pass an argument
> which tells what is the current column.
> Any rationale to use current-column instead of vertical-motion?

But we need to measure the width of a particular chunk of buffer text,
and I don't see how vertical-motion can be used for that: the only
things it returns are:
- a new point position
- the number of screen lines moved over
I can't see how to use it to compute the text's width.


        Stefan






^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-17 19:14           ` Stefan Monnier
@ 2019-09-18  2:34             ` Eli Zaretskii
  2019-09-18 19:59               ` Simen Heggestøyl
  0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2019-09-18  2:34 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 37393, simenheg, sdl.web

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Simen Heggestøyl <simenheg@gmail.com>,
>   37393@debbugs.gnu.org,
>   sdl.web@gmail.com
> Date: Tue, 17 Sep 2019 15:14:45 -0400
> 
> > Once again, risking to talk about something I don't clearly
> > understand: vertical-motion already allows you to pass an argument
> > which tells what is the current column.
> > Any rationale to use current-column instead of vertical-motion?
> 
> But we need to measure the width of a particular chunk of buffer text,
> and I don't see how vertical-motion can be used for that: the only
> things it returns are:
> - a new point position
> - the number of screen lines moved over
> I can't see how to use it to compute the text's width.

What about posn-at-point?





^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-18  2:34             ` Eli Zaretskii
@ 2019-09-18 19:59               ` Simen Heggestøyl
  2019-09-18 20:08                 ` Stefan Monnier
  0 siblings, 1 reply; 15+ messages in thread
From: Simen Heggestøyl @ 2019-09-18 19:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 37393, monnier, sdl.web

Eli Zaretskii <eliz@gnu.org> writes:

> What about posn-at-point?

That one doesn't seem to take the display width of the characters into
account. For instance, in a buffer with "<space><tab><space>" and point
at the end, 'current-column' returns column 9 as expected, while
'posn-at-point' gives 3.

-- Simen





^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-18 19:59               ` Simen Heggestøyl
@ 2019-09-18 20:08                 ` Stefan Monnier
  2019-09-19 15:51                   ` Simen Heggestøyl
  0 siblings, 1 reply; 15+ messages in thread
From: Stefan Monnier @ 2019-09-18 20:08 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, sdl.web

>> What about posn-at-point?
> That one doesn't seem to take the display width of the characters into
> account. For instance, in a buffer with "<space><tab><space>" and point
> at the end, 'current-column' returns column 9 as expected, while
> 'posn-at-point' gives 3.

It should return a lot more information than just a bare number.
I suspect you did not look at the right number.  I think you'd have to
use the pixel (X . Y) information (and divide it by the frame's char
width), rather than the (COL . ROW) one.


        Stefan






^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-18 20:08                 ` Stefan Monnier
@ 2019-09-19 15:51                   ` Simen Heggestøyl
  2019-09-19 17:30                     ` Eli Zaretskii
  0 siblings, 1 reply; 15+ messages in thread
From: Simen Heggestøyl @ 2019-09-19 15:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 37393, sdl.web

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> It should return a lot more information than just a bare number.
> I suspect you did not look at the right number.  I think you'd have to
> use the pixel (X . Y) information (and divide it by the frame's char
> width), rather than the (COL . ROW) one.

Your suspicion is correct, I looked at the COL field.

By using the pixel X divided by (frame-char-width), the results look
right, but I'm getting a slowdown on a 400 line file from 0.03s to 2s.

-- Simen





^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-19 15:51                   ` Simen Heggestøyl
@ 2019-09-19 17:30                     ` Eli Zaretskii
  2019-10-09 16:33                       ` Simen Heggestøyl
  0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2019-09-19 17:30 UTC (permalink / raw)
  To: Simen Heggestøyl; +Cc: 37393, monnier, sdl.web

> From: Simen Heggestøyl <simenheg@gmail.com>
> Cc: eliz@gnu.org, 37393@debbugs.gnu.org, sdl.web@gmail.com
> Date: Thu, 19 Sep 2019 17:51:33 +0200
> 
> By using the pixel X divided by (frame-char-width), the results look
> right, but I'm getting a slowdown on a 400 line file from 0.03s to 2s.

Then I guess this technique won't help in your case.  Sorry for
distracting you.





^ permalink raw reply	[flat|nested] 15+ messages in thread

* bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields'
  2019-09-19 17:30                     ` Eli Zaretskii
@ 2019-10-09 16:33                       ` Simen Heggestøyl
  0 siblings, 0 replies; 15+ messages in thread
From: Simen Heggestøyl @ 2019-10-09 16:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 37393-done, monnier, sdl.web

Eli Zaretskii <eliz@gnu.org> writes:

> Then I guess this technique won't help in your case.  Sorry for
> distracting you.

No problem, thanks the suggestions.

Closing this bug now as the original patch has been installed (with some
changes suggested by Stefan).

-- Simen





^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-10-09 16:33 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-12 17:07 bug#37393: 26.2.90; [PATCH] Speed up 'csv-align-fields' Simen Heggestøyl
2019-09-12 17:46 ` Stefan Monnier
2019-09-15 15:55   ` Simen Heggestøyl
2019-09-15 16:17     ` Eli Zaretskii
2019-09-15 18:43     ` Stefan Monnier
2019-09-17 16:53       ` Simen Heggestøyl
2019-09-17 17:23         ` Eli Zaretskii
2019-09-17 19:14           ` Stefan Monnier
2019-09-18  2:34             ` Eli Zaretskii
2019-09-18 19:59               ` Simen Heggestøyl
2019-09-18 20:08                 ` Stefan Monnier
2019-09-19 15:51                   ` Simen Heggestøyl
2019-09-19 17:30                     ` Eli Zaretskii
2019-10-09 16:33                       ` Simen Heggestøyl
2019-09-17 19:12         ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

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

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 read-only IMAP folder(s) and NNTP newsgroup(s).