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