viernes, 4 de mayo de 2012

Comenzamos la práctica 5

El lunes 7 y martes 8 comenzaremos la última práctica de la asignatura (P5).

En esta práctica vamos a desarrollar un pequeño benchmark para aplicar carga a diferentes subsistemas y medir el tiempo empleado en ejecutarla.

Concretamente, se trata de desarrollar un programa en un lenguaje de alto nivel (el que deseeis) que permita medir y comparar las prestaciones de varios sistemas. Por ejemplo, este programa debe poderse compilar para ejecutarlo en dos sistemas operativos en la misma máquina hardware con el objetivo de comparar los sistemas. Otra opción es tomar dos máquinas diferentes, con el mismo sistema operativo, y ejecutar vuestro programa para compararlas.

Como en todas las prácticas, hay que establecer claramente cuál es el objetivo del benchmark, obtener resultados, analizarlos, presentarlos y obtener un índice que indique qué sistema es mejor para los objetivos planteados.

Podéis usar cualquier lenguaje de programación (Perl, C++, C, PHP, Java...) y la idea sería medir las siguientes cosas:
  • el tiempo que tarda en ejecutar una serie de operaciones aritmético-lógicas (muchos millones de ellas), tanto en coma flotante como enteras.
  • el tiempo que tarda en crear un array de un par de GB en memoria (y rellenarlo)
  • el tiempo que tarda en crear (escritura) varios miles de archivos pequeños
  • el tiempo que tarda en leer varios miles de archivos pequeños
  • el tiempo que tarda en crear (escritura) un fichero de varios GB
  • el tiempo que tarda en leer un fichero de varios GB
  • el tiempo que tarda en mostrar por pantalla varios millones de caracteres (o si domináis alguna librería gráfica, mostrar varios millones de polígonos)
Se puede hacer un solo programa que ejecute varios módulos para medir en secuencia cada una de esas cosas, o se pueden hacer varios programas por separado que midan, cada uno de ellos el tiempo correspondiente. De esa forma habremos medido cómo de bien funcionan los subsistemas de CPU, memoria, disco y gráfica.

En cualquier caso, la medida de tiempos debe hacerse con la máxima precisión posible. Por ejemplo, en todo lenguaje hay funciones que nos permiten tomar tiempos con precisión de microsegundos. Se recomienda usar este tipo de funciones.

Por ejemplo, se puede usar la función gettimeofday:

3 comentarios:

  1. Os he pasado por email un PDF explicando cómo se usa la función gettimeofday en C++

    Os buscaré algún ejemplo sobre su uso en Perl y en Java.

    ResponderEliminar
  2. Si os decidís a hacerla en C++ (con gcc), podéis partir del siguiente código y simplemente cambiar el contenido de la función "proceso()" para hacerle trabajar al subsistema que os apetezca.

    // g++ -o ej_gettimeofday ej_gettimeofday.cc
    #include
    #include

    void proceso(void) {
    unsigned int i=0;
    unsigned int j=0;
    unsigned int k=0;
    for(i=0; i<1000; i++){
    for(j=0; j<1000; j++){
    k*=13; k/=11;
    }
    }
    }

    int main(int argc, char **argv) {
    struct timeval startTime;
    struct timeval endTime;

    gettimeofday(&startTime, NULL);

    proceso();

    gettimeofday(&endTime, NULL);
    // calcular microsegundos
    double tS = startTime.tv_sec*1000000 + (startTime.tv_usec);
    double tE = endTime.tv_sec*1000000 + (endTime.tv_usec);
    std::cout << "[gettimeofday] Tiempo (microseg.): " << tE - tS << std::endl;
    return 0;
    }

    ResponderEliminar
  3. Si preferís hacerlo en Perl, podéis usar el siguiente código:


    #!/usr/bin/perl
    use warnings;
    use strict;
    use Time::HiRes qw( gettimeofday tv_interval);
    my $inicioTiempo = [gettimeofday()];


    my $i=0;
    my $a=47;
    my $b=83;
    my $c=23;
    for( $i=0; $i < 1000000 ; $i++ ) {
    $a = $a * $a + $b;
    $b = $b * $a + $c;
    $c = $a * $c / $b
    }


    print "\nTiempo transcurrido: ". tv_interval( $inicioTiempo ) . " seg \n\n";

    ResponderEliminar