From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.devel,gmane.emacs.diffs Subject: [Emacs-diffs] master 81a1088: Tweak builtin symbol order for speed Date: Sat, 13 Jul 2019 17:54:06 -0700 Organization: UCLA Computer Science Department Message-ID: References: <20190712060726.23831.95266@vcs0.savannah.gnu.org> <20190712060728.23C8920536@vcs0.savannah.gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------F4B80F03E636CE55D2E7B889" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="176190"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 Cc: emacs-diffs@gnu.org To: Pip Cet , emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Jul 14 02:54:18 2019 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1hmSmQ-000jh5-6a for ged-emacs-devel@m.gmane.org; Sun, 14 Jul 2019 02:54:18 +0200 Original-Received: from localhost ([::1]:58560 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hmSmO-00047F-JN for ged-emacs-devel@m.gmane.org; Sat, 13 Jul 2019 20:54:16 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:43833) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hmSmK-00046u-EB for emacs-devel@gnu.org; Sat, 13 Jul 2019 20:54:13 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hmSmI-0007cv-Ou for emacs-devel@gnu.org; Sat, 13 Jul 2019 20:54:12 -0400 Original-Received: from zimbra.cs.ucla.edu ([131.179.128.68]:42056) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hmSmI-0007bO-EK; Sat, 13 Jul 2019 20:54:10 -0400 Original-Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id 9CC9016169F; Sat, 13 Jul 2019 17:54:09 -0700 (PDT) Original-Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id ltuw8NbCNuTa; Sat, 13 Jul 2019 17:54:06 -0700 (PDT) Original-Received: from localhost (localhost [127.0.0.1]) by zimbra.cs.ucla.edu (Postfix) with ESMTP id B3BD8161A3C; Sat, 13 Jul 2019 17:54:06 -0700 (PDT) X-Virus-Scanned: amavisd-new at zimbra.cs.ucla.edu Original-Received: from zimbra.cs.ucla.edu ([127.0.0.1]) by localhost (zimbra.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id F5YJ7ago_r_l; Sat, 13 Jul 2019 17:54:06 -0700 (PDT) Original-Received: from [192.168.1.9] (cpe-23-242-74-103.socal.res.rr.com [23.242.74.103]) by zimbra.cs.ucla.edu (Postfix) with ESMTPSA id 6F3A116169F; Sat, 13 Jul 2019 17:54:06 -0700 (PDT) In-Reply-To: Content-Language: en-US X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 131.179.128.68 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:238575 gmane.emacs.diffs:151498 Archived-At: This is a multi-part message in MIME format. --------------F4B80F03E636CE55D2E7B889 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 7/12/19 12:12 AM, Pip Cet wrote: > I don't understand why this would improve performance this > significantly (maybe because it allows 8-bit offsets to be used rather > than 32-bit ones?). Yes, that's my guess too. For the record, my benchmark platform was my old work desktop (AMD Phenom II X4 910e, circa 2010) running Fedora 30 x86-64, with plain 'make compile-always' (no -j). I really should get that upgraded. > Maybe it would be a good idea to make Vdead a symbol (or a tagged NULL > pointer) and treat it similarly, if this actually improves > performance. It does speed up GC a bit. I installed the attached. Thanks for the suggestion. >> + static char const commonsym[][8] > > I'm curious, why isn't this simply "static char *commonsym[]"? Old performance habits that don't matter here. Besides, that alternative should be 'static char const *const commonsym[]" which is not obviously simpler.... --------------F4B80F03E636CE55D2E7B889 Content-Type: text/x-patch; name="0001-Replace-Vdead-with-tagged-pointer.patch" Content-Disposition: attachment; filename="0001-Replace-Vdead-with-tagged-pointer.patch" Content-Transfer-Encoding: quoted-printable >From 04cbdde94d256d9b3fbfcc67981374a55d339fcd Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 12 Jul 2019 22:29:02 -0700 Subject: [PATCH] Replace Vdead with tagged pointer MIME-Version: 1.0 Content-Type: text/plain; charset=3DUTF-8 Content-Transfer-Encoding: 8bit This speeds up =E2=80=98make compile-always=E2=80=99 by 0.1% on my platfo= rm. Suggested by Pip Cet in: https://lists.gnu.org/r/emacs-devel/2019-07/msg00257.html * src/.gdbinit (pwinx, pgx, xbuffer, xprintstr): Output dead_object () as "DEAD". * src/alloc.c (Vdead, DEADP): Remove. All uses replaced by dead_object () / deadp. (deadp): New function. (init_alloc_once_for_pdumper): Remove no-longer-needed initialization. * src/lisp.h (dead_object): New function. --- src/.gdbinit | 27 ++++++++++++++++++--------- src/alloc.c | 30 +++++++++++------------------- src/lisp.h | 12 +++++++++--- src/pdumper.c | 5 +---- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/.gdbinit b/src/.gdbinit index c0cf639359..e9ba5267ec 100644 --- a/src/.gdbinit +++ b/src/.gdbinit @@ -382,7 +382,7 @@ define pwinx xgetptr $w->contents set $tem =3D (struct buffer *) $ptr xgetptr $tem->name_ - printf "%s", ((struct Lisp_String *) $ptr)->u.s.data + printf "%s", $ptr ? (char *) ((struct Lisp_String *) $ptr)->u.s.data := "DEAD" printf "\n" xgetptr $w->start set $tem =3D (struct Lisp_Marker *) $ptr @@ -508,7 +508,12 @@ define pgx xgettype ($g.object) if ($type =3D=3D Lisp_String) xgetptr $g.object - printf " str=3D0x%x[%d]", ((struct Lisp_String *)$ptr)->u.s.data, $g= .charpos + if ($ptr) + printf " str=3D0x%x", ((struct Lisp_String *)$ptr)->u.s.data + else + printf " str=3DDEAD" + end + printf "[%d]", $g.charpos else printf " pos=3D%d", $g.charpos end @@ -879,7 +884,7 @@ define xbuffer xgetptr $ print (struct buffer *) $ptr xgetptr $->name_ - output ((struct Lisp_String *) $ptr)->u.s.data + output $ptr ? (char *) ((struct Lisp_String *) $ptr)->u.s.data : "DEAD= " echo \n end document xbuffer @@ -1046,13 +1051,17 @@ Print $ as a lisp object of any type. end =20 define xprintstr - set $data =3D (char *) $arg0->u.s.data - set $strsize =3D ($arg0->u.s.size_byte < 0) ? ($arg0->u.s.size & ~ARRA= Y_MARK_FLAG) : $arg0->u.s.size_byte - # GDB doesn't like zero repetition counts - if $strsize =3D=3D 0 - output "" + if (! $arg0) + output "DEAD" else - output ($arg0->u.s.size > 1000) ? 0 : ($data[0])@($strsize) + set $data =3D (char *) $arg0->u.s.data + set $strsize =3D ($arg0->u.s.size_byte < 0) ? ($arg0->u.s.size & ~AR= RAY_MARK_FLAG) : $arg0->u.s.size_byte + # GDB doesn't like zero repetition counts + if $strsize =3D=3D 0 + output "" + else + output ($arg0->u.s.size > 1000) ? 0 : ($data[0])@($strsize) + end end end =20 diff --git a/src/alloc.c b/src/alloc.c index 833176d4e9..7a0611dd3e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -420,14 +420,11 @@ enum mem_type MEM_TYPE_SPARE }; =20 -/* A unique object in pure space used to make some Lisp objects - on free lists recognizable in O(1). */ - -#ifndef ENABLE_CHECKING -static -#endif -Lisp_Object Vdead; -#define DEADP(x) EQ (x, Vdead) +static bool +deadp (Lisp_Object x) +{ + return EQ (x, dead_object ()); +} =20 #ifdef GC_MALLOC_CHECK =20 @@ -499,10 +496,6 @@ static void mem_delete (struct mem_node *); static void mem_delete_fixup (struct mem_node *); static struct mem_node *mem_find (void *); =20 -#ifndef DEADP -# define DEADP(x) 0 -#endif - /* Addresses of staticpro'd variables. Initialize it to a nonzero value if we might unexec; otherwise some compilers put it into BSS. */ @@ -2548,7 +2541,7 @@ void free_cons (struct Lisp_Cons *ptr) { ptr->u.s.u.chain =3D cons_free_list; - ptr->u.s.car =3D Vdead; + ptr->u.s.car =3D dead_object (); cons_free_list =3D ptr; consing_since_gc -=3D sizeof *ptr; gcstat.total_free_conses++; @@ -4374,7 +4367,7 @@ live_cons_holding (struct mem_node *m, void *p) { cp =3D ptr_bounds_copy (cp, b); struct Lisp_Cons *s =3D p =3D cp -=3D offset % sizeof b->conses[0]; - if (!EQ (s->u.s.car, Vdead)) + if (!deadp (s->u.s.car)) return make_lisp_ptr (s, Lisp_Cons); } } @@ -4410,7 +4403,7 @@ live_symbol_holding (struct mem_node *m, void *p) { cp =3D ptr_bounds_copy (cp, b); struct Lisp_Symbol *s =3D p =3D cp -=3D offset % sizeof b->symbols[0]= ; - if (!EQ (s->u.s.function, Vdead)) + if (!deadp (s->u.s.function)) return make_lisp_symbol (s); } } @@ -6717,7 +6710,7 @@ sweep_conses (void) this_free++; cblk->conses[pos].u.s.u.chain =3D cons_free_list; cons_free_list =3D &cblk->conses[pos]; - cons_free_list->u.s.car =3D Vdead; + cons_free_list->u.s.car =3D dead_object (); } else { @@ -6883,7 +6876,7 @@ sweep_symbols (void) } sym->u.s.next =3D symbol_free_list; symbol_free_list =3D sym; - symbol_free_list->u.s.function =3D Vdead; + symbol_free_list->u.s.function =3D dead_object (); ++this_free; } else @@ -7072,7 +7065,7 @@ which_symbols (Lisp_Object obj, EMACS_INT find_max) ptrdiff_t gc_count =3D inhibit_garbage_collection (); Lisp_Object found =3D Qnil; =20 - if (! DEADP (obj)) + if (! deadp (obj)) { for (int i =3D 0; i < ARRAYELTS (lispsym); i++) { @@ -7251,7 +7244,6 @@ init_alloc_once_for_pdumper (void) purebeg =3D PUREBEG; pure_size =3D PURESIZE; mem_init (); - Vdead =3D make_pure_string ("DEAD", 4, 4, 0); =20 #ifdef DOUG_LEA_MALLOC mallopt (M_TRIM_THRESHOLD, 128 * 1024); /* Trim threshold. */ diff --git a/src/lisp.h b/src/lisp.h index 7641b2aab4..e93a219625 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1247,6 +1247,15 @@ make_lisp_ptr (void *ptr, enum Lisp_Type type) #define XSETSYMBOL(a, b) ((a) =3D make_lisp_symbol (b)) #define XSETFLOAT(a, b) ((a) =3D make_lisp_ptr (b, Lisp_Float)) =20 +/* Return a Lisp_Object value that does not correspond to any object. + This can make some Lisp objects on free lists recognizable in O(1). = */ + +INLINE Lisp_Object +dead_object (void) +{ + return make_lisp_ptr (NULL, Lisp_String); +} + /* Pseudovector types. */ =20 #define XSETPVECTYPE(v, code) \ @@ -3759,9 +3768,6 @@ extern byte_ct const memory_full_cons_threshold; #ifdef HAVE_PDUMPER extern int number_finalizers_run; #endif -#ifdef ENABLE_CHECKING -extern Lisp_Object Vdead; -#endif extern Lisp_Object list1 (Lisp_Object); extern Lisp_Object list2 (Lisp_Object, Lisp_Object); extern Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object); diff --git a/src/pdumper.c b/src/pdumper.c index 3d8531c6a4..b80757c207 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -3061,10 +3061,7 @@ dump_object (struct dump_context *ctx, Lisp_Object= object) #if CHECK_STRUCTS && !defined (HASH_Lisp_Type_E2AD97D3F7) # error "Lisp_Type changed. See CHECK_STRUCTS comment in config.h." #endif -#ifdef ENABLE_CHECKING - /* Vdead is extern only when ENABLE_CHECKING. */ - eassert (!EQ (object, Vdead)); -#endif + eassert (!EQ (object, dead_object ())); =20 dump_off offset =3D dump_recall_object (ctx, object); if (offset > 0) --=20 2.17.1 --------------F4B80F03E636CE55D2E7B889--