jueves, 18 de marzo de 2010

Benchmark de rutinas en c

Cuando tenemos un programa funcionalmente terminado, lo ideal es optimizarlo para que no solo funcione correctamente, sino para que también sea rápido.

Lo mejor para estos casos es ver el tiempo que tarda la CPU en realizar una rutina o función de tu programa y ver si mejora (disminuye) al "optimizarlo".

#include <stdio.h>
#include <time.h>

int main()
{
    clock_t A, B;              // Tiempo inicial y final (en ciclos)
    double t;                  // Tiempo en segundos
    int i;

    A = clock();               // Marcamos el inicio
    for (i=0; i<10000; i++)
    {
        /* Código a optimizar */
    };
    B = clock();               // Marcamos el final

    t = (double)(B - A) / CLOCKS_PER_SEC;
    printf("%.16g ms\n", t * 1000.0);

    return 0;
}

Como puedes ver uso un bucle para que se la ejecución de cierto código se repita muchas veces multiplicando el tiempo por 10000 en el caso del ejemplo y así sea mas precisa medición y apreciable la diferencia de tiempo. Ademas no recomiendo mediciones de menos de unos segundo, ya que pierde precisión.

Yo siempre he usado este método para medir tiempos, basándome en el siguiente código de ejemplo que cogí de la MSDN:

// crt_clock.c
/* This example prompts for how long
 * the program is to run and then continuously
 * displays the elapsed time for that period.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void sleep( clock_t wait );

int main( void )
{
    long    i = 6000000L;
    clock_t start, finish;
    double  duration;

    /* Delay for a specified time. */
    printf( "Delay for three seconds\n" );
    sleep( (clock_t)3 * CLOCKS_PER_SEC );
    printf( "Done!\n" );

    /* Measure the duration of an event. */
    printf( "Time to do %ld empty loops is ", i );
    start = clock();
    while ( i-- );
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf( "%2.4f seconds\n", duration );
}

/* Pauses for a specified number of milliseconds. */
void sleep( clock_t wait )
{
    clock_t goal;
    goal = wait + clock();
    while ( goal > clock() );
}

Para Linux visita esta pagina que me acabo de encontrar, a parte de explicar todo esto con mas detalle publica maneras de hacerlo en Linux.

Comparte o puntua esta publicación ▼

0 comentarios:

Publicar un comentario