[PATCH] mini-gmp: avoid a mpz_sizeinbase call in mpz_get_str

Pádraig Brady P at draigBrady.com
Wed Oct 7 18:17:25 CEST 2026


I noticed this when optimizing basenc --base58 in coreutils:

  $ dd bs=64k count=1 if=/dev/urandom of=58.in

  $ time src/basenc-before --base58 58.in >/dev/null
  real  0m3.476s

  $ time src/basenc-after --base58 58.in >/dev/null
  real  0m0.332s

For reference, full libgmp performance is:

  $ time src/basenc-fullgmp --base58 58.in >/dev/null
  real  0m0.014s

* lib/mini-gmp.c (mpz_get_str): The expensive mpz_sizeinbase() call
is unneeded when a buffer is supplied.
---
 lib/mini-gmp.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/lib/mini-gmp.c b/lib/mini-gmp.c
index 87cc12aa0f..9168d98667 100644
--- a/lib/mini-gmp.c
+++ b/lib/mini-gmp.c
@@ -4332,10 +4332,9 @@ mpz_get_str (char *sp, int base, const mpz_t u)
 	return NULL;
     }
 
-  sn = 1 + mpz_sizeinbase (u, base);
   if (!sp)
     {
-      osn = 1 + sn;
+      osn = 2 + mpz_sizeinbase (u, base);
       sp = (char *) gmp_alloc (osn);
     }
   else
-- 
2.55.0



More information about the gmp-devel mailing list