diff options
author | Rich Felker <dalias@aerifal.cx> | 2024-05-06 17:13:23 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2024-05-06 17:13:23 -0400 |
commit | 3f9d4224d8db7868b6c2f526746d597785d30c61 (patch) | |
tree | 29e628c78af5507e3200b06f0153162fc51aa926 | |
parent | a23cf8f9c5ab8ff1e1742a68b352e58b9febbe4a (diff) | |
download | musl-3f9d4224d8db7868b6c2f526746d597785d30c61.tar.gz musl-3f9d4224d8db7868b6c2f526746d597785d30c61.tar.xz musl-3f9d4224d8db7868b6c2f526746d597785d30c61.zip |
printf decimal integer formatting: shave off one division
once the remaining value is less than 10, the modulo operation to produce the final digit and division to prepare for next loop iteration can be dropped. this may be a meaningful performance distinction when formatting low-magnitude numbers in bulk, and should never hurt. based on patch by Viktor Reznov.
-rw-r--r-- | src/stdio/vfprintf.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c index dc648e7e..360d723a 100644 --- a/src/stdio/vfprintf.c +++ b/src/stdio/vfprintf.c @@ -166,7 +166,8 @@ static char *fmt_u(uintmax_t x, char *s) { unsigned long y; for ( ; x>ULONG_MAX; x/=10) *--s = '0' + x%10; - for (y=x; y; y/=10) *--s = '0' + y%10; + for (y=x; y>=10; y/=10) *--s = '0' + y%10; + if (y) *--s = '0' + y; return s; } |