Created
June 27, 2018 08:53
-
-
Save zilder/fc2035aa8c8c78a32c71554917707911 to your computer and use it in GitHub Desktop.
Digits number bench
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <limits.h> | |
#include <math.h> | |
#include <stdio.h> | |
#include <stdint.h> | |
#include <sys/time.h> | |
int digits_new(int num) | |
{ | |
int digits = 1; | |
if (num == 0) | |
return 1; | |
if (num < 0) | |
{ | |
if (num == INT_MIN) | |
// special case for -2^31 because 2^31 can't fit in a two's complement 32-bit integer | |
return 11; | |
digits++; | |
num = -num; | |
} | |
digits += floor(log10(num)); | |
return digits; | |
} | |
int digits_old(int num) | |
{ | |
int sign = 0; | |
if (num < 0) | |
{ | |
if (num == INT_MIN) | |
// special case for -2^31 because 2^31 can't fit in a two's complement 32-bit integer | |
return 12; | |
sign = 1; | |
num = -num; | |
} | |
if (num < 1e5) | |
{ | |
if (num < 1e3) | |
{ | |
if (num < 10) | |
return 1 + sign; | |
else if (num < 1e2) | |
return 2 + sign; | |
else | |
return 3 + sign; | |
} | |
else | |
{ | |
if (num < 1e4) | |
return 4 + sign; | |
else | |
return 5 + sign; | |
} | |
} | |
else | |
{ | |
if (num < 1e7) | |
{ | |
if (num < 1e6) | |
return 6 + sign; | |
else | |
return 7 + sign; | |
} | |
else | |
{ | |
if (num < 1e8) | |
return 8 + sign; | |
else if (num < 1e9) | |
return 9 + sign; | |
else | |
return 10 + sign; | |
} | |
} | |
} | |
#define bench(func) \ | |
do { \ | |
struct timespec start, end; \ | |
uint64_t delta_us; \ | |
int i; \ | |
printf("checking %s... ", #func); \ | |
clock_gettime(CLOCK_MONOTONIC_RAW, &start); \ | |
for (i = 0; i < INT_MAX; i++) \ | |
func(i); \ | |
clock_gettime(CLOCK_MONOTONIC_RAW, &end); \ | |
delta_us = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000; \ | |
printf("%llu ms\n", delta_us); \ | |
} while (0) | |
int main() | |
{ | |
bench(digits_old); | |
bench(digits_new); | |
} |
Author
zilder
commented
Jun 27, 2018
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment