]> git.eshelyaron.com Git - emacs.git/commitdiff
Speed up fixnum printing
authorMattias Engdegård <mattiase@acm.org>
Fri, 18 Mar 2022 12:58:36 +0000 (13:58 +0100)
committerMattias Engdegård <mattiase@acm.org>
Fri, 18 Mar 2022 12:58:36 +0000 (13:58 +0100)
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
src/lisp.h
src/print.c

index 6eda0089702ac21c658f1ff65a4f348c8f5d644b..23b0e7c29d9927ae4925dba6d47e438ff943ec4d 100644 (file)
@@ -2968,6 +2968,29 @@ cons_to_signed (Lisp_Object c, intmax_t min, intmax_t max)
   return val;
 }
 \f
+/* 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);
     }
 
index 21709b125987071e6372314d24123744b68bf239..e4d156c0f4527c35bf32090f50bf8b0a5109b21a 100644 (file)
@@ -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.  */
index 704fc278f2d4f7b02c9d08b11ce7bab204d69323..4a68d15fe0286db9d33542fd74b912fd8cce5f89 100644 (file)
@@ -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;