Skip to content
Snippets Groups Projects
README.md 7.58 KiB
Newer Older
gossa's avatar
gossa committed
# P4a : Analyse de performances de différentes structures

GOSSA JULIEN's avatar
GOSSA JULIEN committed
[Grille d'évaluation P4a](Evaluation.md)
gossa's avatar
gossa committed

## Problème

Description du Problème.
Benjamin Gallier's avatar
Benjamin Gallier committed
Lors du développement d'une application ou d'un logiciel, il est important de l'optimiser au maximum afin de réduire par exemple la consommation du CPU et le temps d'exécution.
Dans notre cas, nous allons nous pencher sur le langage objet Java, où nous allons utiliser l'interface Collections pour gérer nos données.
Cependant, chaque implémentation de cette interface répond à des besoins différents, il est donc important de choisir la bonne structure de données.
Pour répondre à ce problème, nous allons tester ces structures à travers plusieurs opérations, et comparer leurs temps d'execution et leurs allocations mémoire.
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
Je vais tester les trois structures suivantes de l'interface ICollection :
- ArrayList
- LinkedList
- Vector

Je vais tester les trois opérations pour chaque structure ci-dessus:

- L'insertion d'un élément : "add"
- La suppression d'un élément : "remove"
- La présence d'un élément : "contains"


Taille de chacune des structures : 50 000
Fonction random avec un maximum de 50 000
gossa's avatar
gossa committed

## Dispositif expérimental

GOSSA JULIEN's avatar
GOSSA JULIEN committed
### Organisation objet

Benjamin Gallier's avatar
Benjamin Gallier committed
J'ai choisi d'utiliser une seule classe (Main) avec en paramètre la structure et l'opération souhaitées.
GOSSA JULIEN's avatar
GOSSA JULIEN committed

gossa's avatar
gossa committed
### Application

Benjamin Gallier's avatar
Benjamin Gallier committed
[code source de l'étude 1](https://git.unistra.fr/bgallier/P4a/-/blob/master/Application/src/Etude1/Etude1.java)
Benjamin Gallier's avatar
Benjamin Gallier committed

Benjamin Gallier's avatar
Benjamin Gallier committed
[Code source du shell script](https://git.unistra.fr/bgallier/P4a/-/blob/master/FichiersPerf/FichiersSH/perfShEtude1.sh)
Benjamin Gallier's avatar
Benjamin Gallier committed

Benjamin Gallier's avatar
Benjamin Gallier committed
[Code source du script R](https://git.unistra.fr/bgallier/P4a/-/blob/master/FichiersR/ggplotEtude1.R)
gossa's avatar
gossa committed

### Environnement de test

Benjamin Gallier's avatar
Benjamin Gallier committed
Les tests sont réalisés sur le PC de Benjamin Gallier:

gossa's avatar
gossa committed
```
Benjamin Gallier's avatar
Benjamin Gallier committed
Type de CPU           : AMD Ryzen 5 3600 6-Core Processor
Type de package       : Socket AM4
Coeurs CPU            : 6\12 (physique\logique)
Architecture du CPU   : x86_64
Cache données L1      : 6x32 KB
Cache instructions L1 : 6x32 KB
Cache L2              : 6x512 KB
Cache L3              : 32768 KB
Version de Windows    : Windows 10
gossa's avatar
gossa committed
```

### Description de la démarche systématique

```
Benjamin Gallier's avatar
Benjamin Gallier committed
Suite des commandes, ou script, à exécuter pour produire les données :

- Compilation du fichier Etude1.java :
  javac Etude1.sh

- Execution du script et résultats sauvegarder dans perfEtude1.csv :
  ./perfShEtude1.sh | tee ../FichiersCSV/perfEtude1.csv
gossa's avatar
gossa committed
```

## Résultats préalables

Benjamin Gallier's avatar
Benjamin Gallier committed
### Temps d'éxécution
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
![plot](https://git.unistra.fr/bgallier/P4a/-/blob/master/Graphiques/graphique_temps_etude1.png)
gossa's avatar
gossa committed

### Consommation mémoire

Benjamin Gallier's avatar
Benjamin Gallier committed
![plot](https://git.unistra.fr/bgallier/P4a/-/blob/master/Graphiques/graphique_cpu_etude1.png)
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
### Analyse et discussion des résultats préalables
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
### ArrayList
Que ce soit pour l'opération add, contains ou remove, l'ArrayList a un temps d'éxécution assez faible tout comme sa consommation CPU.
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
### LinkedList
Que ce soit pour l'opération add, contains ou remove, la LinkedList à une consommation CPU trop élévé pour un temps d'éxécution plutôt faible. Elle est à éviter surtout si la taille de la structure est conséquente.
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
### Vector
Que ce soit pour l'opération add, contains ou remove, la structure Vector est bien plus rapide en terme de temps d'éxécution que les deux autres structures, cependant elle est bien plus gourmande en terme de consommation CPU.
gossa's avatar
gossa committed

## Etude approfondie

### Hypothèse

Benjamin Gallier's avatar
Benjamin Gallier committed
Lors de l'étude 1, les valeurs sont générées aléatoirement grâce à l'utilisation d'un Random allant de 0 à 50 000.
On peut alors se demander comment les structures agiront avec une utilisation de tableaux triés.
On définit donc l'hypothèse suivante :
Lea consommation CPU et le temps d'éxécution des structures testées Vector, ArrayList et LinkedList seront réduites avec l'utilisation de tableaux ordonnées.
gossa's avatar
gossa committed

### Protocole expérimental de vérification de l'hypothèse

Benjamin Gallier's avatar
Benjamin Gallier committed
[code source de l'étude 2](https://gitlab.unistra.fr/bgallier/P4a/-/blob/master/Application/src/Etude2/Etude2.java)
Benjamin Gallier's avatar
Benjamin Gallier committed
[Code source du shell script](https://gitlab.unistra.fr/bgallier/P4a/-/blob/master/FichiersPerf/FichiersSH/perfShEtude2.sh)
Benjamin Gallier's avatar
Benjamin Gallier committed
[Code source du script R](https://gitlab.unistra.fr/bgallier/P4a/-/blob/master/FichiersR/ggplotEtude2.R)
gossa's avatar
gossa committed

```
Benjamin Gallier's avatar
Benjamin Gallier committed
Suite des commandes, ou script, à exécuter pour produire les données :

- Compilation du fichier Etude2.java :
  javac Etude2.sh

- Execution du script et résultats sauvegarder dans perfEtude2.csv :
  ./perfShEtude2.sh | tee ../FichiersCSV/perfEtude2.csv
gossa's avatar
gossa committed
```

Benjamin Gallier's avatar
Benjamin Gallier committed
Le changement au niveau de l'application de l'étude 2 par rapport à l'étude 1 se situe dans la fonction creationCollection et la fonction add:
On ajoute les valeurs par ordre croissant au lieu d'utiliser un nombre généré aléatoirement grâce à l'utilisation d'un Random.

gossa's avatar
gossa committed
### Résultats expérimentaux

Benjamin Gallier's avatar
Benjamin Gallier committed
### Temps d'éxécution
Benjamin Gallier's avatar
Benjamin Gallier committed
![plot](https://git.unistra.fr/bgallier/P4a/-/blob/master/Graphiques/graphique_temps_etude2.png)
Benjamin Gallier's avatar
Benjamin Gallier committed

### Consommation mémoire
gossa's avatar
gossa committed

Benjamin Gallier's avatar
Benjamin Gallier committed
![plot](https://git.unistra.fr/bgallier/P4a/-/blob/master/Graphiques/graphique_cpu_etude2.png)
Benjamin Gallier's avatar
Benjamin Gallier committed

### Analyse et discussion des résultats expérimentaux

### ArrayList
Pour l'opération add, l'absence de nombre randoms n'affecte pas les performances. Le temps ainsi que la consommation CPU sont négligeables.
Pour l'opération contains, elle est plus rapide qu'avec les randoms car les valeurs sont plus petites et triés, même si on observe une légère hausse du temps d'éxecution à partir de 20 000 opérations.
Pour l'opération remove, tout comme l'opération add, le temps ainsi que la consommation CPU sont négligeables, même si on observe une légère baisse.

### LinkedList
Pour l'opération add, l'absence de nombre randoms n'affecte pas les performances. Le temps ainsi que la consommation CPU sont négligeables.
Pour l'opération contains, le temps augmente considérablement à partir de 20 000 opérations, il faut donc privilégier une ArrayList pour ce type d'opération.
Pour l'opération remove, tout comme l'ArrayList, le temps d'éxécution et la consommation CPU sont négligeables, car la procédure reste identique et indépendante de la taille de la liste.

### Vector
Pour l'opération add, le temps reste négligeable par rapport à l'étude 1. Cependant, on observe une forte décroissance puis d'une stabilisation de la consommation CPU à partir de 30 000 opérations.
Pour l'opération contains, le temps augmente peu à peu à partir de 20 000 opérations et la consommation mémoire subit une forte hausse à partir de 30 000 opérations puis d'une forte baisse.
Pour l'opération remove, le temps d'éxécution reste négligeable et on observe un cycle périodique pour la consommation mémoire.
gossa's avatar
gossa committed

## Conclusion et travaux futurs
Benjamin Gallier's avatar
Benjamin Gallier committed
Grâce à ces deux études sur les strucutres comme l'ArrayList, la LinkedList et la strucure Vector pour les opérations add, contains et remove, j'ai pu conclure que l'ordonnancement de la liste permet un gain de temps d'éxécution. De ce fait, il est préférable de privilégier des structures ordonnées lors du développement d'application afin de bénéficier d'un gain de temps, gain qui devient davantage nécessaire en fonction de la taille de l'application.

L'ArrayList est toujours plus performante que la LinkedList ce qui explique la faible utilisation des LinkedList dans les applications.
La strucutre Vector est la plus rapide, cependant elle reste plus gourmande en terme de consommation CPU par rapport à l'ArrayList.

Dans mes travaux futurs, je compte utiliser une ArrayList si j'ai besoin d'une faible consommation de CPU, et j'utiliserai une structure Vector dans le cas où j'ai besoin d'une éxécution rapide, au détriment des performances du CPU.