All pastes #127936 Raw Edit

Lindquist

public text v1 · immutable
·published 2006-08-12 15:25 UTC
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