/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4 -*- */
/* vi: set expandtab shiftwidth=4 tabstop=4: */

#include "modp_numtoa.h"
#include <stdio.h>
#include <time.h>
#include <stdint.h>

int main()
{
    char buf[100];
    uint32_t max = 1000000;
    clock_t t0,t1;
    double d, last;
    uint32_t i;
    uint8_t ju8;
    uint16_t ju16;
    int8_t j8;
    int16_t j16;
    printf("%s", "    type   \tsprintf\tsnprf\tnumtoa\timprovement\n");

    printf("unsigned 8\t");
    t0 = clock();
    for (i = 0; i < max; ++i) {
        ju8 = (uint8_t) i;
        sprintf(buf, "%hhu", ju8);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for ( i = 0; i < max; ++i) {
        ju8 = (uint8_t) i;
        snprintf(buf, sizeof(buf), "%hhu", ju8);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        ju8 = (uint8_t) i;
        modp_uitoa10(ju8, buf);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);

    printf("unsigned 16\t");
    t0 = clock();
    for (i = 0; i < max; ++i) {
        ju16 = (uint16_t) i;
        sprintf(buf, "%hu", ju16);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for ( i = 0; i < max; ++i) {
        ju16 = (uint16_t) i;
        snprintf(buf, sizeof(buf), "%hu", ju16);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        ju16 = (uint16_t) i;
        modp_uitoa10(ju16, buf);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);


    printf("unsigned 32\t");
    t0 = clock();
    for (i = 0; i < max; ++i) {
        sprintf(buf, "%u", i);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for ( i = 0; i < max; ++i) {
        snprintf(buf, sizeof(buf), "%u", i);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        modp_uitoa10(i, buf);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);

    printf("signed 8\t");
    t0 = clock();
    for (i = 0; i < max; ++i) {
        j8 = (int8_t) i;
        sprintf(buf, "%hhd", ju8);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for ( i = 0; i < max; ++i) {
        j8 = (int8_t) i;
        snprintf(buf, sizeof(buf), "%hhd", j8);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        j8 = (int8_t) i;
        modp_itoa10(j8, buf);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);

    printf("signed 16\t");
    t0 = clock();
    for (i = 0; i < max; ++i) {
        j16 = (int16_t) i;
        sprintf(buf, "%hd", j16);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for ( i = 0; i < max; ++i) {
        j16 = (int16_t) i;
        snprintf(buf, sizeof(buf), "%hd", j16);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        j16 = (int16_t) i;
        modp_itoa10(j16, buf);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);

    printf("%s", "signed 32\t");
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        sprintf(buf, "%d", i);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for ( i = 0; i < max; ++i) {
        snprintf(buf, sizeof(buf), "%d", i);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        modp_itoa10(i, buf);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);

    printf("%s", "\n    type   \t%e\t%f\t%g\tdtoa\timprovement\n");
    printf("%s", "double\t\t");
    t0 = clock();
    for (i = 0; i < max; ++i) {
        sprintf(buf, "%e", (double)(i));
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        d = (double)i + 0.1;
        snprintf(buf, sizeof(buf), "%f", d);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        d = (double)i + 0.123456;
        snprintf(buf, sizeof(buf), "%g", d);
    }
    t1 = clock();
    last = (t1-t0);
    printf("%lu\t", (unsigned long)(t1-t0));
    fflush(stdout);

    t0 = clock();
    for (i = 0; i < max; ++i) {
        d = (double)i + 0.123456;
        modp_dtoa(d, buf, 6);
    }
    t1 = clock();
    printf("%lu\t", (unsigned long)(t1-t0));
    printf("%.1fx\n", last/(t1-t0));
    fflush(stdout);

    return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1