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)
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:
- en Perl => http://bit.ly/JHzSCD
- en C/C++ => http://bit.ly/IOnA7e
- en Java => http://bit.ly/IJC5hN
Os he pasado por email un PDF explicando cómo se usa la función gettimeofday en C++
ResponderEliminarOs buscaré algún ejemplo sobre su uso en Perl y en Java.
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.
ResponderEliminar// 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;
}
Si preferís hacerlo en Perl, podéis usar el siguiente código:
ResponderEliminar#!/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";