
Dans 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.pngn1 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.
Partager cet article :
Tags : benchmark,
gnuplot,
bash,
script
Suivre le flux RSS des commentaires de cet article
Revenir à la liste des articles