]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Lib: Optimized printing of numbers
authorOndrej Zajicek <santiago@crfreenet.org>
Fri, 8 Nov 2024 17:54:13 +0000 (18:54 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Fri, 8 Nov 2024 17:54:13 +0000 (18:54 +0100)
One simple trick makes printing of numbers ~4x faster.

lib/printf.c

index 424d545f915ece6f52e49ef4ac0b08e65ea80279..68d3bb743c2b7dc0917310a0bfb734e17520cc48 100644 (file)
@@ -73,10 +73,25 @@ static char * number(char * str, u64 num, uint base, int size, int precision,
        i = 0;
        if (num == 0)
                tmp[i++]='0';
-       else while (num != 0) {
-               uint res = num % base;
-               num = num / base;
-               tmp[i++] = digits[res];
+       else if (base == 10) {
+               /* Separate cases to have fixed divisors */
+               while (num != 0) {
+                       uint res = num % 10;
+                       num = num / 10;
+                       tmp[i++] = digits[res];
+               }
+       } else if (base == 16) {
+               while (num != 0) {
+                       uint res = num % 16;
+                       num = num / 16;
+                       tmp[i++] = digits[res];
+               }
+       } else {
+               while (num != 0) {
+                       uint res = num % base;
+                       num = num / base;
+                       tmp[i++] = digits[res];
+               }
        }
        if (i > precision)
                precision = i;