Files
CONTROLE_DEV51_vaisse/exo2/REPONSES.md
vaisse 4b2a3ce64f ajout
2025-10-15 16:55:06 +02:00

8.4 KiB

OPERATIONS EFFECTUEES:

dans le terminal : gcc -g -pg racine.c
Puis, après avoir exécuté le programme, on lance gprof pour profiler le code.
Dans le terminal : ./a.out nombres.txt
					gprof

nombres.txt est un fichier généré avec le programme de writefile.c. Il contient une liste de nombres
strictements positifs. Une constante en début de fichier permet de définir combien il y en a dans le fichier.

Profiling

Le flat profile d'une exécution de ce programme avec le fichier nombres.txt (il contient 999 entiers) nous indique que racineCarree a consomée quasiment 100% du temps d'exécution, soit 1332.01 secondes pour effectuer les 999 appels. Le temps de racineCarreeTab est négligeable en comparaison, ce qui est logique puisqu'elle ne fait qu'appeller racineCarre pour chaque valeur du tableau. Ici, on voit bien que la grandeur d'un nombre traitée importe bien plus que le nombre de valeurs choisi. 

Le callgraph correspond à peu près à ce qu'on vient de décrire. RacineCarreeTab appel racineCarree 999 fois. racineCarreeTab est quant-à-elle appelée qu'une seule fois. On peut déduire de cete première analyse que si un endroit du code devait être améliorer, ce serait plutôt au niveau de racineCarree().

Il est à noté ici que la grandeur des nombres (voir nombres.txt) a beaucoup influé sur la performance du code. Pour des valeurs plus petites (max 9999) l'exécution aurait sûrement été plus rapide.

Complexité Cyclomatique

Pour racineCarre(): Le graphe représentant cet algorithme possède 5 arrêtes, 4 noeuds, et 1 composante connexe. Cela nous donne une complexité cyclomatique de 3.

Pour racineCarreTab(): Le graphe représentant cet algorithme possède 9 arrêtes, 6 noeuds, et 2 composantes connexes. Cela nous donne une complexité cyclomatique de 7.

Complexité Algorithmique

pour racineCarre(): Soit n la valeur d'entrée. Elle correspond au nombre d'opérations effectuées divisée par 2, puisqu'on ne teste que la moitiée des valeurs pour trouver la racine carrée.Si n est pair, la complexité est d'exactement O(n/2). si n est impair, la complexité est de O((n-1)/2).

pour racineCarreTab(): on introduit en plus m, le nombre de valeurs à traiter. Pour chacune de ces valeurs, soit n, racineCarree() est rapellée. La complexité est donc de O(m*n/2). La valeur reste imprécise car la complexité varie pour chaque n en fonction de s'il est pair ou impair.

Résulat de gprof

Each sample counts as 0.01 seconds. % cumulative self self total
time seconds seconds calls Ks/call Ks/call name
100.21 1332.01 1332.01 999 0.00 0.00 racineCarree 0.00 1332.01 0.00 1 0.00 1.33 racineCarreeTab

% the percentage of the total running time of the time program used by this function.

cumulative a running sum of the number of seconds accounted seconds for by this function and those listed above it.

self the number of seconds accounted for by this seconds function alone. This is the major sort for this listing.

calls the number of times this function was invoked, if this function is profiled, else blank.

self the average number of milliseconds spent in this ms/call function per call, if this function is profiled, else blank.

total the average number of milliseconds spent in this ms/call function and its descendents per call, if this function is profiled, else blank.

name the name of the function. This is the minor sort for this listing. The index shows the location of the function in the gprof listing. If the index is in parenthesis it shows where it would appear in the gprof listing if it were to be printed.

Copyright (C) 2012-2025 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved.

	     Call graph (explanation follows)

granularity: each sample hit covers 2 byte(s) for 0.00% of 1332.01 seconds

index % time self children called name 1332.01 0.00 999/999 racineCarreeTab [2] [1] 100.0 1332.01 0.00 999 racineCarree [1]

            0.00 1332.01       1/1           main [3]

[2] 100.0 0.00 1332.01 1 racineCarreeTab [2] 1332.01 0.00 999/999 racineCarree [1]

                                             <spontaneous>

[3] 100.0 0.00 1332.01 main [3] 0.00 1332.01 1/1 racineCarreeTab [2]

This table describes the call tree of the program, and was sorted by the total amount of time spent in each function and its children.

Each entry in this table consists of several lines. The line with the index number at the left hand margin lists the current function. The lines above it list the functions that called this function, and the lines below it list the functions this one called. This line lists: index A unique number given to each element of the table. Index numbers are sorted numerically. The index number is printed next to every function name so it is easier to look up where the function is in the table.

 % time	This is the percentage of the `total' time that was spent
	in this function and its children.  Note that due to
	different viewpoints, functions excluded by options, etc,
	these numbers will NOT add up to 100%.

 self	This is the total amount of time spent in this function.

 children	This is the total amount of time propagated into this
	function by its children.

 called	This is the number of times the function was called.
	If the function called itself recursively, the number
	only includes non-recursive calls, and is followed by
	a `+' and the number of recursive calls.

 name	The name of the current function.  The index number is
	printed after it.  If the function is a member of a
	cycle, the cycle number is printed between the
	function's name and the index number.

For the function's parents, the fields have the following meanings:

 self	This is the amount of time that was propagated directly
	from the function into this parent.

 children	This is the amount of time that was propagated from
	the function's children into this parent.

 called	This is the number of times this parent called the
	function `/' the total number of times the function
	was called.  Recursive calls to the function are not
	included in the number after the `/'.

 name	This is the name of the parent.  The parent's index
	number is printed after it.  If the parent is a
	member of a cycle, the cycle number is printed between
	the name and the index number.

If the parents of the function cannot be determined, the word <spontaneous>' is printed in the name' field, and all the other fields are blank.

For the function's children, the fields have the following meanings:

 self	This is the amount of time that was propagated directly
	from the child into the function.

 children	This is the amount of time that was propagated from the
	child's children to the function.

 called	This is the number of times the function called
	this child `/' the total number of times the child
	was called.  Recursive calls by the child are not
	listed in the number after the `/'.

 name	This is the name of the child.  The child's index
	number is printed after it.  If the child is a
	member of a cycle, the cycle number is printed
	between the name and the index number.

If there are any cycles (circles) in the call graph, there is an entry for the cycle-as-a-whole. This entry shows who called the cycle (as parents) and the members of the cycle (as children.) The `+' recursive calls entry shows the number of function calls that were internal to the cycle, and the calls entry for each member shows, for that member, how many times it was called from other members of the cycle.

Copyright (C) 2012-2025 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved.

Index by function name