Newer
Older
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.
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
J'ai choisi d'utiliser une seule classe (Main) avec en paramètre la structure et l'opération souhaitées.
[code source de l'étude 1'](https://gitlab.unistra.fr/bgallier/P4a/Application/src/Etude1/Etude1.java)
[Code source du shell script'](https://gitlab.unistra.fr/bgallier/P4a/FichiersPerf/FichiersSH/perfShEtude1.sh)
[Code source du script R'](https://gitlab.unistra.fr/bgallier/P4a/FichiersR/ggplotEtude1.R)
Les tests sont réalisés sur le PC de Benjamin Gallier:
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
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


### 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.
### 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.
### 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.
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.
[code source de l'étude 2'](https://gitlab.unistra.fr/bgallier/P4a/Application/src/Etude2/Etude2.java)
[Code source du shell script'](https://gitlab.unistra.fr/bgallier/P4a/FichiersPerf/FichiersSH/perfShEtude2.sh)
[Code source du script R'](https://gitlab.unistra.fr/bgallier/P4a/FichiersR/ggplotEtude2.R)
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
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.
### Temps d'exécution

### Consommation mémoire

### 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.
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.