• Un petit script pour faire du Benchmark

    Un petit script pour faire du BenchmarkDans le cadre d'un travail demandé en cours de Théorie des Graphes, je devais regarder l'évolution du temps d'exécution d'un programme en fonction d'un paramètre. (Pour les curieux, c'est la k-Coloration d'un Graphe à n Sommets)

    Je me suis bricolé un petit script qui fait ça tout seul, et génère un graphe (via l'excellent GnuPlot) (ou affiche les temps d'exécution)

    C'est la première fois que je fais un vrai script en Bash (ie un script qui n'est pas 3 commandes mises à la suite), du coup, pour la structure, je me suis inspiré d'un petit script de P4bl0.

    Le nom du programme à tester est hard coded, mais ce n'est pas très dur à modifier.

    N'hésitez pas à vous en servir si ça vous est utile ;-), de même que toutes les critiques sont les bienvenues (je n'y connais pas grand chose (pour ne pas dire que dalle) en scripts Bash)

    L'usage, c'est $[...]:~> ./bench.sh [-i n] p n1 n2 itv graphe.png
    n1 valeur de départ du paramètre
    n2 valeur finale du paramètre
    itv variation du paramètre à chaque pas
    graphe.png nom du fichier généré
    Pour le -i n, n est le nombre d'exécutions du programme pour chaque point (par défaut, 10)

    #!/bin/sh
    if [ "$1" = "-i" ]; then
      ITER="$2"
      shift
      shift
    else
      ITER="10"
    fi

    _bench_usage() {
      cat <<USAGE
    Usage: bench disp n1 n2 interval : Affiche le temps pris pour traiter des graphes de n sommets, n variant de n1 à n2 par pas de interval.
           bench plot n1 n2 interval file: Crée le fichier file, un graphique PNG affichant le temps pris pour traiter des graphes de n sommets,
                                       n variant de n1 à n2 par pas de interval.
           bench help: Affiche cette page d'aide.
      La première lettre de chaque commande peut être utilisée
      Le flag -i permet de spécifier combien de fois un graphe à n sommets doit être calculé.
      Valeur par défaut : 10
    USAGE

    }

    _bench_disp() {
      i=$1
      while [ $i -le $2 ]; do
        START=$(date +%s)
        _bench_run
        STOP=$(date +%s)
        echo "Graphe à" $i "sommets :" $[$STOP-$START] "secondes"
        i=$[i + $3]
      done
    }

    _bench_plot() {
      # Création d'un fichier temporaire contenant les données à afficher
      i=$1
      echo "# Temps de calcul pour des graphes de "$1" à "$2" sommets (par pas de "$3")" > plot.dat
      while [ $i -lt $2 ]; do
        START=$(date +%s)
        _bench_run
        STOP=$(date +%s)
        echo $i $[$STOP-$START] >> plot.dat
        i=$[i + $3]
      done

      # Génération du graphe
      gnuplot<<EOF
    set xlabel 'Nombre de Sommets du graphe'
    set ylabel 'Temps de calcul (s)'
    set xrange [*:*]
    set yrange [*:*]
    set grid
    set nokey
    set output "${4}"
    set terminal png small
    plot "plot.dat" with linespoints
    EOF


      # Suppression du fichier temporaire
      rm -f plot.dat
    }

    _bench_run() {
      j="0"
      while [ $j -lt $ITER ]; do
        ../source/coloration -r $i -v 1>>coloration.log 2>> error.log
        echo "">>coloration.log
        echo "">>error.log
        j=$[j + 1]
      done
    }

    _bench() {
      local ACTION="$1"
      shift
      case $ACTION in
        d|disp) _bench_disp "$@" ;;
        p|plot) _bench_plot "$@" ;;
        h|help|*) _bench_usage >&2 ;;
      esac
    }

    _bench "$@"

    echo
    exit 0
    [code=bash]
    #!/bin/sh
    if [ "$1" = "-i" ]; then
      ITER="$2"
      shift
      shift
    else
      ITER="10"
    fi

    _bench_usage() {
      cat <<USAGE
    Usage: bench disp n1 n2 interval : Affiche le temps pris pour traiter des graphes de n sommets, n variant de n1 à n2 par pas de interval.
           bench plot n1 n2 interval file: Crée le fichier file, un graphique PNG affichant le temps pris pour traiter des graphes de n sommets,
                                       n variant de n1 à n2 par pas de interval.
           bench help: Affiche cette page d'aide.
      La première lettre de chaque commande peut être utilisée
      Le flag -i permet de spécifier combien de fois un graphe à n sommets doit être calculé.
      Valeur par défaut : 10
    USAGE
    }

    _bench_disp() {
      i=$1
      while [ $i -le $2 ]; do
        START=$(date +%s)
        _bench_run
        STOP=$(date +%s)
        echo "Graphe à" $i "sommets :" $[$STOP-$START] "secondes"
        i=$[i + $3]
      done
    }

    _bench_plot() {
      # Création d'un fichier temporaire contenant les données à afficher
      i=$1
      echo "# Temps de calcul pour des graphes de "$1" à "$2" sommets (par pas de "$3")" > plot.dat
      while [ $i -lt $2 ]; do
        START=$(date +%s)
        _bench_run
        STOP=$(date +%s)
        echo $i $[$STOP-$START] >> plot.dat
        i=$[i + $3]
      done

      # Génération du graphe
      gnuplot<<EOF
    set xlabel 'Nombre de Sommets du graphe'
    set ylabel 'Temps de calcul (s)'
    set xrange [*:*]
    set yrange [*:*]
    set grid
    set nokey
    set output "${4}"
    set terminal png small
    plot "plot.dat" with linespoints
    EOF

      # Suppression du fichier temporaire
      rm -f plot.dat
    }

    _bench_run() {
      j="0"
      while [ $j -lt $ITER ]; do
        ../source/coloration -r $i -v 1>>coloration.log 2>> error.log
        echo "">>coloration.log
        echo "">>error.log
        j=$[j + 1]
      done
    }

    _bench() {
      local ACTION="$1"
      shift
      case $ACTION in
        d|disp) _bench_disp "$@" ;;
        p|plot) _bench_plot "$@" ;;
        h|help|*) _bench_usage >&2 ;;
      esac
    }

    _bench "$@"

    echo
    exit 0
    [/code]


    C'est facilement modifiable pour faire un comparatif entre deux programmes, à condition de regarder un peu la doc de GnuPlot.
    « Un peu de ConkyPasser de SVN à Git + Gitosis »

    Tags Tags : , , ,
  • Commentaires

    1
    Mardi 2 Juin 2009 à 13:04
    Stylé
    2
    Lundi 27 Juillet 2009 à 13:53
    Le gros gros souci de ce petit script, c'est le calcul du temps d'exécution.
    Pour que ce soit valable, il ne faut pas utiliser l'ordi sur d'autres choses.

    Je vais fouiller la man page de time pour sortir un truc un peu mieux.
    3
    Mercredi 4 Novembre 2009 à 17:57
    Merci pour ton passage sur mon blog !
    Suivre le flux RSS des commentaires de cet article


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :