GNU bug report logs -
#72689
31.0.50; Proposal to improve string-pixel-width
Previous Next
Reported by: David Ponce <da_vid <at> orange.fr>
Date: Sat, 17 Aug 2024 22:05:01 UTC
Severity: normal
Found in version 31.0.50
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
Full log
Message #8 received at 72689 <at> debbugs.gnu.org (full text, mbox):
> Date: Sun, 18 Aug 2024 00:03:22 +0200
> From: David Ponce via "Bug reports for GNU Emacs,
> the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
>
> The function string-pixel-width is essential for calculating pixel
> dimensions, especially for UI components. And in this context this
> function can be called very often when the display is refreshed.
>
> I propose the attached patch to make string-pixel-width faster while
> using less memory, as shown by the following results of a basic
> benchmark run in emacs -Q to compare the current implementation and this
> proposal:
>
> ;; Basic benchmark
> (let* ((text1 (make-string 1000 ?x))
> (text2 (propertize text1 'line-prefix "XXXX ")))
> (list
> (string-pixel-width text1)
> (string-pixel-width text2)
> (progn (garbage-collect)
> (benchmark-run 10000 (string-pixel-width text1)))
> (progn (garbage-collect)
> (benchmark-run 10000 (string-pixel-width text2)))
> ;;(insert text "\n")
> ))
>
> ;; Result with current implementation (4 run):
> (12000 12000 (1.854707611 17 0.120106147) (1.884129905 17 0.12258791599999996))
>
> (12000 12000 (1.846544798 17 0.12243524500000003) (1.8822177530000002 17 0.12349287399999997))
>
> (12000 12000 (1.851244125 17 0.12162041699999998) (1.860517709 17 0.12352999599999998))
>
> (12000 12000 (1.8542218929999998 17 0.12164553900000001) (1.856302462 17 0.122891689))
>
> ;; Result with proposed implementation (4 run):
> (12000 12000 (1.698974522 0 0.0) (1.727446 2 0.014782505999999973))
>
> (12000 12000 (1.701800124 0 0.0) (1.728024111 2 0.014718454999999908))
>
> (12000 12000 (1.6850850800000001 0 0.0) (1.732370238 2 0.014801913000000111))
>
> (12000 12000 (1.7356390130000001 0 0.0) (1.7858915800000001 2 0.014816158000000135))
>
> From my observations, the new implementation is around 8% faster, and
> trigger less GC. When there is no line-prefix property to
> remove, the new implementation doesn't trigger any GC after 10000 runs.
> Otherwise, only 2 GC are triggered instead of 17.
>
> Maybe this proposal might be of interest, or at least provide some ideas
> for improvement.
Thanks. The idea SGTM, but I think the implementation needs to cater
for the case where more than one execution thread performs this job
"in parallel" (however improbable this could sound), so we need to be
able to detect when this buffer is "busy". The simplest way is to use
some boolean buffer-local variable, which will be set non-nil when the
function starts using the buffer and reset to nil when the function is
done with its job.
This bug report was last modified 263 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.