rendered paste body#include <cstdio>
#include <cstring>
#include <ctime>
#include <cassert>
/*!
\brief
Simple timer class.
*/
class SimpleTimer
{
clock_t d_baseTime;
public:
SimpleTimer() : d_baseTime(clock()) {}
void restart() { d_baseTime = clock(); }
double elapsed() { return static_cast<double>(clock() - d_baseTime) / CLOCKS_PER_SEC; }
};
unsigned as_hex(const char* value)
{
unsigned x = 0;
const unsigned char* ptr = (const unsigned char*)value;
unsigned char b;
unsigned char count = 0;
while ((b = *ptr++) && (++count <= sizeof(unsigned)*2))
{
x <<= 4;
switch (b)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
x |= b - '0';
break;
case 'A':
case 'a':
x |= 10;
break;
case 'B':
case 'b':
x |= 11;
break;
case 'C':
case 'c':
x |= 12;
break;
case 'D':
case 'd':
x |= 13;
break;
case 'E':
case 'e':
x |= 14;
break;
case 'F':
case 'f':
x |= 15;
break;
default:
return 0;
}
}
return x;
}
double t1_avg = 0;
double t2_avg = 0;
const unsigned N = 500000;
static char data[N][8];
void init()
{
for (unsigned i=0; i<N; ++i)
{
sprintf(data[i], "%X", i);
}
}
void bench()
{
SimpleTimer timer;
timer.restart();
for (unsigned i=0; i<N; ++i)
{
unsigned x = as_hex(data[i]);
assert(x == i);
}
double t1 = timer.elapsed();
t1_avg += t1;
timer.restart();
for (unsigned i=0; i<N; ++i)
{
unsigned x;
sscanf(data[i], "%X", &x);
assert(x == i);
}
double t2 = timer.elapsed();
t2_avg += t2;
printf("as_hex = %0.6f s\nsscanf = %0.6f s\n", t1, t2);
}
int main()
{
init();
int NN = 15;
for (int i=0; i<NN; ++i)
bench();
t1_avg /= NN*N;
t2_avg /= NN*N;
printf("as_hex avg = %E s\nsscanf avg = %E s\n", t1_avg, t2_avg);
return 0;
}
as_hex = 0.031000 s
sscanf = 0.109000 s
as_hex = 0.032000 s
sscanf = 0.109000 s
as_hex = 0.031000 s
sscanf = 0.110000 s
as_hex = 0.015000 s
sscanf = 0.125000 s
as_hex = 0.016000 s
sscanf = 0.109000 s
as_hex = 0.031000 s
sscanf = 0.110000 s
as_hex = 0.031000 s
sscanf = 0.109000 s
as_hex = 0.016000 s
sscanf = 0.125000 s
as_hex = 0.031000 s
sscanf = 0.094000 s
as_hex = 0.031000 s
sscanf = 0.110000 s
as_hex = 0.015000 s
sscanf = 0.110000 s
as_hex = 0.031000 s
sscanf = 0.109000 s
as_hex = 0.032000 s
sscanf = 0.093000 s
as_hex = 0.032000 s
sscanf = 0.109000 s
as_hex = 0.031000 s
sscanf = 0.094000 s
as_hex avg = 5.413333E-008 s
sscanf avg = 2.166667E-007 s