Analyse de la fonction qsort de la glibc
πλ Octobre 2013
derni` ere compilation : 7 novembre 2014
R´esum´e
Dans le cours, nous avons ´etabli que le tri rapide qsort traite, en moyenne, un tableau de taille n en utilisant 2nlogn comparaisons. Un fait facile `a mettre en ´evidence au travers d’une exp´erience num´erique introductive `a :qsort,/usr/bin/time,gnuplot,make,gcc,bash.
1 mesure des temps
On dispose de plusieurs solutions pour faire des mesures de temps de calcul :
— `a la source :time(),clock(),gettimeofday(). . .
— la commande internetime.
— le profileurgprof.
— la commande externe/user/bin/time.
Avec la derni`ere option, on peut lancer le chronom´etrage d’une commande, en pr´ecisant un format d’affichage :
sample> / u s r / b i n / t i m e −−f o r m a t=”%E” s l e e p 7 0 : 0 7 . 0 2
sample> / u s r / b i n / t i m e −−f o r m a t=”%E” s l e e p 1 | t r : M 0 : 0 1 . 0 0
sample> / u s r / b i n / t i m e −−f o r m a t=”%E” s l e e p 1 |& t r : M 0M01 . 0 0
On notera la diff´erence avec la commande internetimequi mesure le temps de caclcul d’un pipeline :
sample> t i m e s l e e p 1 | g r e p u s e r r e a l 0m1. 0 0 8 s
u s e r 0m0. 0 0 0 s s y s 0m0. 0 0 4 s
sample> t i m e s l e e p 1 |& g r e p u s e r r e a l 0m1. 0 0 5 s
u s e r 0m0. 0 0 0 s
Table 1 – Les principales options du format d’affichage de la commande /usr/bin/time
FMT d´etails
%E Elapsed real time (in [hours :]minutes :seconds)
%e (Not in tcsh.) Elapsed real time (in seconds)
%S Total number of CPU-seconds spent in kernel mode
%U Total number of CPU-seconds spent in user mode
%P Ratio CPU
%M Memory size
%F Number of major page faults.
%R Number of minor, or recoverable, page faults.
%W Number of times the process was swapped out of main memory
%c Number of times the process was context-switched
TIME( 1 ) Linux User ’ s Manual NAME
t i m e − t i m e a s i m p l e command o r g i v e r e s o u r c e u s a g e SYNOPSIS
t i m e [ o p t i o n s ] command [ arguments . . . ] DESCRIPTION
The t i m e command r u n s t h e s p e c i f i e d program command w i t h t h e g i v e n arguments . When command f i n i s h e s , t i m e w r i t e s a m es sag e t o s t a n d a r d e r r o r g i v i n g t i m i n g s t a t i s t i c s about
t h i s program run .
Note : some s h e l l s ( e . g . , bash ( 1 ) ) have a b u i l t−i n t i m e command t h a t p r o v i d e s l e s s f u n c t i o n a l i t y than t h e
command
d e s c r i b e d h e r e . To a c c e s s t h e r e a l command , you may need t o s p e c i f y i t s pathname ( s o m e t h i n g l i k e / u s r / b i n / t i m e ) .
s y s 0m0. 0 0 3 s
sample> ( t i m e s l e e p 1 ) |& g r e p u s e r u s e r 0m0. 0 0 0 s
On constate que, par d´efaut, le r´esultat de la mesure est envoy´e sur la sortie erreur standard. Les principales options du format de la commande/usr/bin/time sont r´esum´ees dans la tabletab. [??].
2 makefile
On implante le tri rapide de la bibioth`eque standard, dans une sourceqsort.c.
Le document que vous lisez est contruit `a partir de cette source, les compila- tions sont pilot´ees par un fichier makefile. Les principaux ingr´edients d’une exp´erience num´erique y sont pr´esents :
— lemakefileet ses cibles.
Table 2 – Les principales options de la commandemake.
option
make pour satifaire la premi`ere cible make -d pour voir les tentatives implicites make -B pour forcer les compilations make cible pour satisfaire cible
make -C changer de r´ep´ertoire make X=13 initialis´ee la variable X
— la compilation des objets.
— la compilation d’un ex´ecutable.
— un script pour r´ealiser les mesures.
— gnuplotpour dessiner.
— pdflatexpour compiler la source LATEX.
Rappelons quemake, ouvre un fichiermakefiledu r´epertoire courant pour mettre `a jour la premi`ere cible en fonction de certaines action sous des conditions de d´ependances.
c i b l e : d e p e n d a n c e s [ t a b u l a t i o n ] a c t i o n 1 [ t a b u l a t i o n ] a c t i o n 2
Les utilisations courantes de la commande make sont r´esum´ees dans tab.
[??].
Dans l’exemple,
— make nice met les sources C dans le style de codage dit Kernighan &
Richie.
— make clean efface les traits de constructions.
— make proper pour repartir sur de nouvelles bases.
SHELL=/b i n / bash CFLAGS=−Wall −g
a l l : c o u n t . p d f
c o u n t . p d f : c o u n t . png c o u n t . t e x p d f l a t e x c o u n t . t e x
q s o r t . e x e : t a b l e . o q s o r t . c
g c c $ (CFLAGS) t a b l e . o q s o r t . c −o q s o r t . e x e t a b l e . o : t a b l e . c
g c c $ (CFLAGS) −c t a b l e . c c o u n t . t x t : q s o r t . e x e
f o r l i n {1 . . 1 6}; do\
. / q s o r t . e x e −l $ $ l −c ;\ done > c o u n t . t x t
c o u n t . png : c o u n t . p l t c o u n t . t x t
s e d −n ’ s / [ a−z ]∗=/ /gp ’ c o u n t . t x t > c o u n t . d a t g n u p l o t c o u n t . p l t
c l e a n :
rm −f ∗. l o g ∗. aux rm −f ∗˜
p r o p e r :
rm −f ∗. e x e ∗. d at ∗. png ∗. o make c l e a n
n i c e :
i n d e n t −k r ∗. c t a r :
make p r o p e r
t a r c v f . . / sample . t a r ∗
3 graphique
Le graphique est construit pargnuplot`a partir d’un fichier de commandes count.plt, et d’un fichier de donn´eescount.dat.
s e t o u t p u t ’ c o u n t . png ’ i n p u t = ” c o u n t . d a t ” s e t t e r m i n a l png
s e t t i t l e ’ a n a l y s e de q u i c k s o r t ’
p l o t i n p u t w i t h l i n e s , x∗l o g( x ) , 2∗x∗l o g( x ) q u i t
1. Reproduire le graphique analogue.
2. Comparer ces r´esultats avec ceux du cours.
4 qsort
Le programme propos´e utilise deux fonctions importantes des bibliot`eques standards :getoptpour g´erer les options de la ligne de commande et la fonction de tri g´en´eriqueqsort.
1 #include”table.h”
2 3
4 intcomp = 0;
5
6 intcmp(const void∗x,const void∗y)
7 {
8 comp++;
9 if (∗(int ∗) x<∗(int∗) y)
10 return−1;
11 if (∗(int ∗) x>∗(int∗) y)
12 return+1;
13 return0;
14 }
15
16 intmain(intargc,char∗argv[])
17 {
18 int i , n = 0, ∗t;
19 int opt, count = 0, skip = 0;
20 while ((opt = getopt(argc, argv,”l : n:cs”)) !=−1){
21 switch (opt){
22 case’l ’:
23 n = 1<<atoi(optarg);
24 break;
25 case’n’:
26 n = atoi(optarg);
27 break;
28 case’c’:
29 count = 1;
30 break;
31 case’s’:
32 skip = 1;
33 break;
34 default: /∗ ’?’ ∗/
35 fprintf (stderr , ”Usage: %s−ln{number} −count −skip\n”,
36 argv[0]) ;
37 exit (1);
38 }
39 }
40 srandom( time(NULL));
41 t = calloc(n, sizeof(t));
42 for (i = 0; i <n; i ++)
43 t[ i ] = random();
44 if ( ! skip) {
45 qsort(t, n, sizeof(int), cmp);
46 if (count)
47 printf (”\nn=%d count=%d”, n, comp);
48 }
49 return0;
50 }
1. Quelles sont les options g´er´ees dansqsort.c? 2. Reproduire l’exempleman 3 qsort.
3. Modifier cet exemple pour trier des nombres de petites tailles pass´es par la ligne de commande.
5 code source
Obtenir le code source de la fonctionqsortde laglibc.
1. Comment est implant´ee la r´ecursion ?
2. Comment est implant´ee la coupure ?
3. Quelle est la valeur de seuil pour la r´ecursion ?
6 sort
1. Utiliser leltracepour v´erifier que sortutiliseqsort.
2. Mesurer le temps de calcul de la commande externesortsur des fichiers al´eatoires.
— Ecrire une commande pour trier les lignes d’un fichier.
— Comparer les performances avecsort.
— Comparer avec un scriptpython.
— Comparer avec un scriptperl.