emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 4d61badad1: Speed up fixnum printing


From: Mattias Engdegård
Subject: master 4d61badad1: Speed up fixnum printing
Date: Fri, 18 Mar 2022 09:02:14 -0400 (EDT)

branch: master
commit 4d61badad15e8213c84798b85f10868fc48b94ee
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Speed up fixnum printing
    
    Use the new number-to-string code to speed up fixnum printing, with
    similar results (often more than twice as fast as before).
    
    * src/data.c (Fnumber_to_string): Move fixnum conversion to...
    (fixnum_to_string): ... this new function.
    * src/lisp.h: (fixnum_to_string): External declaration.
    * src/print.c (print_object): Use fixnum_to_string instead of sprintf.
---
 src/data.c  | 38 ++++++++++++++++++++++++--------------
 src/lisp.h  |  1 +
 src/print.c |  6 ++++--
 3 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/data.c b/src/data.c
index 6eda008970..23b0e7c29d 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2968,6 +2968,29 @@ cons_to_signed (Lisp_Object c, intmax_t min, intmax_t 
max)
   return val;
 }
 
+/* Render NUMBER in decimal into BUFFER which ends right before END.
+   Return the start of the string; the end is always at END.
+   The string is not null-terminated.  */
+char *
+fixnum_to_string (EMACS_INT number, char *buffer, char *end)
+{
+  EMACS_INT x = number;
+  bool negative = x < 0;
+  if (negative)
+    x = -x;
+  char *p = end;
+  do
+    {
+      eassume (p > buffer && p - 1 < end);
+      *--p = '0' + x % 10;
+      x /= 10;
+    }
+  while (x);
+  if (negative)
+    *--p = '-';
+  return p;
+}
+
 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
        doc: /* Return the decimal representation of NUMBER as a string.
 Uses a minus sign if negative.
@@ -2978,21 +3001,8 @@ NUMBER may be an integer or a floating point number.  */)
 
   if (FIXNUMP (number))
     {
-      EMACS_INT x = XFIXNUM (number);
-      bool negative = x < 0;
-      if (negative)
-       x = -x;
       char *end = buffer + sizeof buffer;
-      char *p = end;
-      do
-       {
-         eassume (p > buffer && p - 1 < buffer + sizeof buffer);
-         *--p = '0' + x % 10;
-         x /= 10;
-       }
-      while (x);
-      if (negative)
-       *--p = '-';
+      char *p = fixnum_to_string (XFIXNUM (number), buffer, end);
       return make_unibyte_string (p, end - p);
     }
 
diff --git a/src/lisp.h b/src/lisp.h
index 21709b1259..e4d156c0f4 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -622,6 +622,7 @@ extern AVOID args_out_of_range_3 (Lisp_Object, Lisp_Object, 
Lisp_Object);
 extern AVOID wrong_type_argument (Lisp_Object, Lisp_Object);
 extern Lisp_Object default_value (Lisp_Object symbol);
 extern void defalias (Lisp_Object symbol, Lisp_Object definition);
+extern char *fixnum_to_string (EMACS_INT number, char *buffer, char *end);
 
 
 /* Defined in emacs.c.  */
diff --git a/src/print.c b/src/print.c
index 704fc278f2..4a68d15fe0 100644
--- a/src/print.c
+++ b/src/print.c
@@ -2060,8 +2060,10 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
          }
        else
          {
-           int len = sprintf (buf, "%"pI"d", i);
-           strout (buf, len, len, printcharfun);
+           char *end = buf + sizeof buf;
+           char *start = fixnum_to_string (i, buf, end);
+           ptrdiff_t len = end - start;
+           strout (start, len, len, printcharfun);
          }
       }
       break;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]