Skip to content

Instantly share code, notes, and snippets.

@zilder
Created June 27, 2018 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zilder/fc2035aa8c8c78a32c71554917707911 to your computer and use it in GitHub Desktop.
Save zilder/fc2035aa8c8c78a32c71554917707911 to your computer and use it in GitHub Desktop.
Digits number bench
#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);
}
@zilder
Copy link
Author

zilder commented Jun 27, 2018

gcc -O0 -ggdb bench.c -o bench
./bench

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment