all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Pip Cet <pipcet@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: [Emacs-diffs] master f18af6c: Audit use of lsh and fix glitches
Date: Fri, 24 Aug 2018 18:00:10 +0000	[thread overview]
Message-ID: <CAOqdjBc-uGQ8wbPzASfusj8wPstys4FXy-Gt0wBtBzh-tR6mvQ@mail.gmail.com> (raw)
In-Reply-To: <jwv6001gjzu.fsf-monnier+emacs@gnu.org>

On Thu, Aug 23, 2018 at 3:56 PM Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> > Well, it isn't `==' if we're building with
> > --enable-check-lisp-object-type,
>
> Currently, the resulting assembly code should be pretty close even in
> that case, tho.

Okay; I wasn't sure whether we were talking about a literal "people
use == on Lisp_Objects" problem or not. The resulting assembly code is
indeed equivalent to a `==', it seems.

> The whole purpose of hash-consing (for me) is to avoid turning EQ into
> something like:
>
>     if (BIGNUMP (x))
>         return slow_eq (x, y);
>     else
>         return x == y;
>
> What we do in slow_eq is largely irrelevant: the problem is the cost of
> `if (BIGNUMP (x))`, both in terms of code size and processing time.

I understand that.

In fact, the cost is fairly (and, to me, surprisingly) high, about 1%.
That is, indeed, way more than I thought, and I'll have to look at the
assembler code to figure out why it's so expensive.

But what I want is only about one tenth as bad (in terms of code size)
as what you describe:

the code you don't want:
 13 .text         00227f8e  0000000000419a00  0000000000419a00  00019a00  2**4
the code you do want (i.e. vanilla):
 13 .text         001d945e  0000000000419a00  0000000000419a00  00019a00  2**4
the code I want:
 13 .text         001e0b3e  0000000000419a00  0000000000419a00  00019a00  2**4

(I got it down to 24816 bytes of code size difference with another
compiler, but still using the standard make flags on an x86_64
pc-linux-gnu system.)

The performance penalty is a quarter of a clock cycle per problematic
EQ, on this machine, though obviously anything in that range depends
on your precise CPU architecture and surrounding insns that affect
superscalar scheduling. We call EQ a lot, there are between 15 and 32
billion problematic calls in the temacs/emacs invocations to rebuild
all .elc files in the Emacs distribution. ("problematic" means that
gcc wasn't able to prove that one argument to EQ couldn't possibly be
a bignum, and had to emit a conditional branch insn). So that also
works out to something in the 1% range. (However, upon inspection it
turns out that adding the debugging code makes gcc fail to optimize
away many of the problematic calls, so the actual number may be much
less than 1%).

The size of the emacs binary, stripped, is also about 1% more with my code.

The difference between the code you suggested and mine is mostly
NILP(), though my test code optimizes away all tag bit checks if the
compiler proves either argument is definitely not a bignum, or that
the arguments have different tag bits. I'm also using
__builtin_expect, something I think should be okay in this
exceptionally hot single location.



  reply	other threads:[~2018-08-24 18:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20180821204437.16880.99611@vcs0.savannah.gnu.org>
     [not found] ` <20180821204439.62390209A6@vcs0.savannah.gnu.org>
2018-08-22 12:36   ` [Emacs-diffs] master f18af6c: Audit use of lsh and fix glitches Pip Cet
2018-08-22 13:35     ` Ken Brown
2018-08-22 13:44       ` Paul Eggert
2018-08-22 15:50         ` Pip Cet
2018-08-22 17:27           ` Paul Eggert
2018-08-22 20:05             ` Pip Cet
2018-08-22 21:53               ` Paul Eggert
2018-08-22 20:45           ` Stefan Monnier
2018-08-23 14:55             ` Pip Cet
2018-08-23 15:56               ` Stefan Monnier
2018-08-24 18:00                 ` Pip Cet [this message]
2018-08-24 20:55                   ` Paul Eggert
2018-08-25 15:02                     ` Pip Cet
2018-08-25 18:02                       ` Stefan Monnier
2018-08-25 21:24                       ` Paul Eggert
2018-08-28 14:08                 ` hash-consing bignums and eq==eql Stefan Monnier
2018-08-29 13:32                   ` Pip Cet
2018-08-29 19:23                     ` Stefan Monnier
2018-08-29 19:31                     ` Paul Eggert
2018-08-29 20:50                       ` Stefan Monnier
2018-09-09  3:09                       ` Stefan Monnier
2018-09-09  6:26                         ` Paul Eggert
2018-08-22 13:49       ` [Emacs-diffs] master f18af6c: Audit use of lsh and fix glitches Pip Cet
2018-08-22 14:52         ` Eli Zaretskii

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=CAOqdjBc-uGQ8wbPzASfusj8wPstys4FXy-Gt0wBtBzh-tR6mvQ@mail.gmail.com \
    --to=pipcet@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /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.