Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (22)
.vscode/settings.json
Rplots.pdf
*.class
# P4a : Analyse de performances de différentes structures <div align='center'>
<h1>P4a : Analyse de performances de différentes structures
</h1>
<h2><a href ="https://docs.google.com/spreadsheets/d/1x72glVEQHPx56Wr8G0RNQgfQXGX6xCsjms_6b7J6si0/edit?usp=sharing">[Grille d'évaluation]</a>
</h2>
<h3>BERTUOL Yoann</h3>
</div>
[Grille d'évaluation P4a](https://docs.google.com/spreadsheets/d/1x72glVEQHPx56Wr8G0RNQgfQXGX6xCsjms_6b7J6si0/edit?usp=sharing
)
## Problème ## Problème
Description du Problème. Lors du développement d'une application en Java (ou dans un autre langage), nous utilisons très régulièrement des `Collections` pour stocker des données.
Cependant, chaque implémentation de cette interface réponds à certaines problématiques, et donc ce choix devient important lors de la phase d'optimisation de l'application.
Mon but fut alors de comparer le temps d'exécution et d'utilisation mémoire de différentes collections afin de voir laquelle est la plus performante.
Description de tous les paramètres exploratoires du problème Pour ce faire, j'ai testé 3 opérations différentes :
- L'*insertion* d'un élément
- La *présence* d'un élément
- La *suppression* d'un élément
Pour réaliser mes tests, j'ai choisi 3 classes implémentant l'interface `ICollection` qui sont :
- `ArrayList`
- `LinkedList`
- `HashSet`
Afin d'observer les différences de temps d'exécution et d'utilisation mémoire, j'ai choisi de faire varier les paramètres suivants afin
de pouvoir choisir laquelle répond le mieux à mon problème, et dans quels circonstances :
- Le nombre de tests par opération
- La taille de la structure
## Dispositif expérimental ## Dispositif expérimental
### Application ### Application
[code source de l'application](chemin) [code source de l'application](./src/Main.java)
```
Usage : java Main <structure> <longueur> <operation>
``` ```
Description de l'application et des arguments ```
structure :
LinkedList => LinkedList
HashSet => HashSet
Autres écritures => ArrayList
operation:
Présence => Contains
Suppression => Remove
Autres écritures => Add
``` ```
[code source du script shell](./shellscript/script.sh)
```
Usage : ./script.sh | tee ../data/perf.dat
```
[code source du script R](./graphs/graphique.R)
```
Usage : ./graphique.R
(vérifier que le fichier data/perf.dat à été rempli à l'aide du script shell)
```
### Environnement de test ### Environnement de test
Description de la plateforme de test J'ai fais nos tests sur les serveurs dédiés aux élèves de l'IUT, voici le résumé des informations tirées de [`/proc/cpuinfo`](./data/cpuinfo.txt)
``` ```
Extrait pertinent de /proc/cpuinfo model name : QEMU Virtual CPU version 0.13
cpu MHz : 2294.246
cache size : 512 KB
cpu cores : 1
``` ```
### Description de la démarche systématique ### Description de la démarche systématique
...@@ -31,48 +74,129 @@ Extrait pertinent de /proc/cpuinfo ...@@ -31,48 +74,129 @@ Extrait pertinent de /proc/cpuinfo
Description de la démarche systématique et de l'espace d'exploration pour chaque paramètres. Description de la démarche systématique et de l'espace d'exploration pour chaque paramètres.
``` ```
Suite des commandes, ou script, à exécuter pour produire les données. ./script.sh | tee ../data/perf.dat
-> compile les fichiers .java nécéssaires à l'éxécution du Main
-> Execute la batterie de tests grâce aux fichiers java (compilé)
-> ./graphique.R : créé les deux graphiques souhaités
``` ```
## Résultats préalables ## Résultats préalables
### Temps d'exécution ### Temps d'exécution
![plot](prealable.png) ![plot](graphs/graph_time.png)
### Consommation mémoire ### Consommation mémoire
![plot](prealable-mem.png) ![plot](graphs/graph_memoire.png)
### Analyse des résultats préalables ### Analyse des résultats préalables
La mémoire se comporte exactement pareil sur les 4 versions. On remarque ici une nette différence de temps lors de l'utilisation d'une Hashset dans n'importe quelle situation et pourtant, à travers l'étude de la mémoire utilisé on voit que la `Hashset` et plus gourmand, et donc répondras à une demande de rapidité et non de consommation minimale.
Les temps d'exécutions dépendent essentiellement de l'affichage des valeurs du tableau. De plus on voit aussi que l'`ArrayList` est un peu plus rapide que la `LinkedList` peut importe la situation, sans pour autant demander de la mémoire supplémentaire. Il faut donc privilégier l'`ArrayList` à la `LinkedList` dans toutes situations.
La version 2 de recherche semble un peu plus rapide.
### Discussion des résultats préalables ### Discussion des résultats préalables
Explications précises et succinctes sur ce que les limites des résultats Le `HashSet` est beaucoup plus rapide que les deux autres structures étudiées pour tous les tests car les valeurs qu'il contient sont triées. Cependant elle se retrouve beaucoup plus gourmande pour ces opérations et doit donc être utilisée pour répondre à une problématique de rapidité plûtot que d'optimisation mémoire.
préalables et ce qu'ils ne permettent pas de vérifier.
Quant à la `LinkedList`, elle réside sur un principe de liste chaînée et donc de maillons, c'est donc pour cela qu'elle devient rapidement gourmande par rapport aux autres structures notamment lorsqu'elle atteint une taille assez conséquente.
Enfin, l'`ArrayList` est une liste polyvalente alliant un temps d'éxecution relativement faible, sans pour autant devenir gourmande en mémoire, ce qui explique qu'elle soit couramment utilisé, sans compter son principe de fonctionnement trivial.
## Etude approfondie ## Etude approfondie
### Hypothèse ### Hypothèse
Expression précise et succincte d'une hypothèse. Dans les tests précédents, nous avons remarqué que les performances de la structure `HashSet` sont vraiment intéressantes et rapides. malgré sa consommation de ressources supplémentaires, la durée très courte d'éxecution rends la structure la plus efficace sur de courtes utilisations. Mais alors notre génération de valeurs fut aléatoire, et nous pouvons nous demander comment les structures réagissent lors de l'utilisation de tableaux triées. Nous posons donc l'hypothèse que les ressources mémoire des structures testées (`HashSet`,`ArrayList`,`LinkedList`) seront réduites dans le cadre de l'utilisation de tableaux triés.
Nous utiliserons des structures remplies de **500.000** éléments, pour pouvoir comparer nos xpérimentations avec nos valurs précédentes.
### Protocole expérimental de vérification de l'hypothèse ### Protocole expérimental de vérification de l'hypothèse
Expression précise et succincte du protocole. [code source de l'application](./src/Hypothese.java)
```
Usage : java Hypothese <structure> <longueur> <operation>
```
```
structure :
LinkedList => LinkedList
HashSet => HashSet
Autres écritures => ArrayList
operation:
Présence => Contains
Suppression => Remove
Autres écritures => Add
```
[code source du script shell](./shellscript/script.sh)
```
Usage : ./script.sh Hypothese | tee ../data/perf_hypothese.dat
```
[code source du script R](./graphs/graphique_hypothese.R)
```
Usage : ./graphique_hypothese.R
(vérifier que le fichier data/perf_hypothese.dat à été rempli à l'aide du script shell)
``` ```
Suite des commandes, ou script, à exécuter pour produire les données. Nous avons juste changer le remplissage des différentes structures pour la rendre ordonnée et croissante :
```java
public static Collection add(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.add(i);
}
return c;
}
``` ```
### Résultats expérimentaux ### Résultats expérimentaux
#### Temps d'exécution
![plot](graphs/graph_time_hypo.png)
#### Consommation mémoire
![plot](graphs/graph_memoire_hypo.png)
### Analyse des résultats expérimentaux ### Analyse des résultats expérimentaux
Nous remarquons déjà par les axes de nos graphes qu'au niveau du temps de traitement, les plus grands temps sont passés de plus de 5 min à moins de 30 secondes, pour toutes les structures testées. plus précisement :
```
`ArrayList`:
Ajout : Temps négligeable => Temps négligable
Présence : 0 sec => 10 sec en moyenne
Suppression : Croissante faible avec le nombre de requete => Temps négligable
`LinkedList`:
Ajout : Temps négligeable => Temps négligable
Présence : Temps négligeable => 25 sec en moyenne
Suppression : Croissante forte avec le nombre de requete => Temps négligable
```
### Discussion des résultats expérimentaux ### Discussion des résultats expérimentaux
`ArrayList` :
Vitesse :
- L'ajout d'un valeur n'est pas affecté par l'ordre de la liste car c'est totalement indépendant à la nature de la liste.
- La présence en revanche, est bien plus affecté car dans le cadre d'une liste ordonnée trouver une valeur revient à trouver son indentation ce qui prendras bien plus de temps.
- Enfin le temps de suppression s'est effondrée car il est bien plus rapide de supprimer une valeur égale à son indentation, surtout pour une structure basée sur un tableau .
Mémoire :
`LinkedList`:
Vitesse :
Toutes les études de vitesses sont équivalentes avec l'ArrayList mais, de part le chaînage en maillon de cette structure, les écarts sont bien plus grands, c qui explique la différence de 15 secondes sur la partie de présence
Mémoire :
`Hashset`:
Vitesse :
Mémoire :
## Conclusion et travaux futurs ## Conclusion et travaux futurs
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 1
siblings : 1
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 2
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 2
siblings : 1
core id : 0
cpu cores : 1
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 3
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 3
siblings : 1
core id : 0
cpu cores : 1
apicid : 3
initial apicid : 3
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 4
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 4
siblings : 1
core id : 0
cpu cores : 1
apicid : 4
initial apicid : 4
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 5
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 5
siblings : 1
core id : 0
cpu cores : 1
apicid : 5
initial apicid : 5
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 6
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 6
siblings : 1
core id : 0
cpu cores : 1
apicid : 6
initial apicid : 6
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 7
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 7
siblings : 1
core id : 0
cpu cores : 1
apicid : 7
initial apicid : 7
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 8
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 8
siblings : 1
core id : 0
cpu cores : 1
apicid : 8
initial apicid : 8
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 9
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 9
siblings : 1
core id : 0
cpu cores : 1
apicid : 9
initial apicid : 9
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 10
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 10
siblings : 1
core id : 0
cpu cores : 1
apicid : 10
initial apicid : 10
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 11
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 11
siblings : 1
core id : 0
cpu cores : 1
apicid : 11
initial apicid : 11
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 12
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 12
siblings : 1
core id : 0
cpu cores : 1
apicid : 12
initial apicid : 12
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 13
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 13
siblings : 1
core id : 0
cpu cores : 1
apicid : 13
initial apicid : 13
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 14
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 14
siblings : 1
core id : 0
cpu cores : 1
apicid : 14
initial apicid : 14
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 15
vendor_id : AuthenticAMD
cpu family : 6
model : 2
model name : QEMU Virtual CPU version 0.13
stepping : 3
microcode : 0x1000065
cpu MHz : 2294.246
cache size : 512 KB
physical id : 15
siblings : 1
core id : 0
cpu cores : 1
apicid : 15
initial apicid : 15
fpu : yes
fpu_exception : yes
cpuid level : 4
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid tsc_known_freq pni cx16 popcnt hypervisor lahf_lm svm abm sse4a 3dnowprefetch vmmcall
bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips : 4588.49
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
Size Operation OpSize Type Time Memory
500000 Ajout 10000 ArrayList 0.16 40580
500000 Ajout 10000 LinkedList 0.13 36556
500000 Ajout 10000 HashSet 0.16 40408
500000 Ajout 20000 ArrayList 0.14 40256
500000 Ajout 20000 LinkedList 0.17 36568
500000 Ajout 20000 HashSet 0.14 38760
500000 Ajout 30000 ArrayList 0.17 38928
500000 Ajout 30000 LinkedList 0.15 38992
500000 Ajout 30000 HashSet 0.18 43480
500000 Ajout 40000 ArrayList 0.17 38692
500000 Ajout 40000 LinkedList 0.20 45268
500000 Ajout 40000 HashSet 0.18 45604
500000 Ajout 50000 ArrayList 0.15 44944
500000 Ajout 50000 LinkedList 0.17 41476
500000 Ajout 50000 HashSet 0.20 46188
500000 Présence 10000 ArrayList 25.40 58160
500000 Présence 10000 LinkedList 65.48 62136
500000 Présence 10000 HashSet 1.26 101448
500000 Présence 20000 ArrayList 54.81 58776
500000 Présence 20000 LinkedList 129.91 62192
500000 Présence 20000 HashSet 1.45 103348
500000 Présence 30000 ArrayList 76.95 60580
500000 Présence 30000 LinkedList 198.83 64208
500000 Présence 30000 HashSet 1.23 100752
500000 Présence 40000 ArrayList 105.89 56772
500000 Présence 40000 LinkedList 258.52 58388
500000 Présence 40000 HashSet 1.23 103412
500000 Présence 50000 ArrayList 133.60 60412
500000 Présence 50000 LinkedList 321.48 60204
500000 Présence 50000 HashSet 1.21 102008
500000 Suppression 10000 ArrayList 27.64 53772
500000 Suppression 10000 LinkedList 60.40 58264
500000 Suppression 10000 HashSet 1.27 103908
500000 Suppression 20000 ArrayList 52.35 56464
500000 Suppression 20000 LinkedList 133.22 58452
500000 Suppression 20000 HashSet 1.24 95144
500000 Suppression 30000 ArrayList 79.13 56428
500000 Suppression 30000 LinkedList 197.35 58228
500000 Suppression 30000 HashSet 1.22 92644
500000 Suppression 40000 ArrayList 108.83 58664
500000 Suppression 40000 LinkedList 258.79 58172
500000 Suppression 40000 HashSet 1.23 96524
500000 Suppression 50000 ArrayList 132.33 56492
500000 Suppression 50000 LinkedList 321.48 58200
500000 Suppression 50000 HashSet 1.29 94432
Size Operation OpSize Type Time Memory
500000 Ajout 10000 ArrayList 0.15 40536
500000 Ajout 10000 LinkedList 0.16 42464
500000 Ajout 10000 HashSet 0.17 36352
500000 Ajout 20000 ArrayList 0.15 40596
500000 Ajout 20000 LinkedList 0.15 40464
500000 Ajout 20000 HashSet 0.15 40304
500000 Ajout 30000 ArrayList 0.14 40572
500000 Ajout 30000 LinkedList 0.16 38784
500000 Ajout 30000 HashSet 0.17 42700
500000 Ajout 40000 ArrayList 0.17 40892
500000 Ajout 40000 LinkedList 0.15 40996
500000 Ajout 40000 HashSet 0.16 40796
500000 Ajout 50000 ArrayList 0.16 42820
500000 Ajout 50000 LinkedList 0.15 42772
500000 Ajout 50000 HashSet 0.17 41400
500000 Présence 10000 ArrayList 0.42 54072
500000 Présence 10000 LinkedList 0.46 57548
500000 Présence 10000 HashSet 0.92 106428
500000 Présence 20000 ArrayList 0.73 55896
500000 Présence 20000 LinkedList 1.10 59556
500000 Présence 20000 HashSet 0.85 102436
500000 Présence 30000 ArrayList 1.23 55844
500000 Présence 30000 LinkedList 2.12 59512
500000 Présence 30000 HashSet 0.86 100332
500000 Présence 40000 ArrayList 1.91 55744
500000 Présence 40000 LinkedList 3.47 57544
500000 Présence 40000 HashSet 0.96 100020
500000 Présence 50000 ArrayList 2.86 59764
500000 Présence 50000 LinkedList 6.39 61676
500000 Présence 50000 HashSet 1.01 100560
500000 Suppression 10000 ArrayList 3.15 57372
500000 Suppression 10000 LinkedList 0.22 61488
500000 Suppression 10000 HashSet 0.83 100536
500000 Suppression 20000 ArrayList 5.79 57684
500000 Suppression 20000 LinkedList 0.24 57528
500000 Suppression 20000 HashSet 0.98 99700
500000 Suppression 30000 ArrayList 8.46 59744
500000 Suppression 30000 LinkedList 0.23 60996
500000 Suppression 30000 HashSet 0.94 100416
500000 Suppression 40000 ArrayList 11.00 55516
500000 Suppression 40000 LinkedList 0.24 59432
500000 Suppression 40000 HashSet 0.82 101980
500000 Suppression 50000 ArrayList 13.55 55416
500000 Suppression 50000 LinkedList 0.29 57496
500000 Suppression 50000 HashSet 0.91 102324
graphs/graph_memoire.png

146 KiB

graphs/graph_memoire_hypo.png

140 KiB

graphs/graph_time.png

146 KiB

graphs/graph_time_hypo.png

130 KiB

#!/usr/bin/Rscript --slave
library(ggplot2)
perf <- read.table("../data/perf.dat", header=TRUE)
ggplot(perf,aes(OpSize,Time)) +
geom_smooth() +
geom_point() +
facet_grid(
rows = vars(Type),
cols = vars(Operation)
) +
ggtitle("Consommation de temps sur les structures testées") +
ggsave("graph_time.png")
ggplot(perf,aes(OpSize,Memory)) +
geom_smooth() +
geom_point() +
facet_grid(
rows = vars(Type),
cols = vars(Operation)
) +
ggtitle("Consommation de mémoire sur les structures testées") +
ggsave("graph_memoire.png")
\ No newline at end of file
#!/usr/bin/Rscript --slave
library(ggplot2)
perf <- read.table("../data/perf_hypothese.dat", header = TRUE)
ggplot(perf,aes(OpSize,Time)) +
geom_smooth() +
geom_point() +
facet_grid(
rows = vars(Type),
cols = vars(Operation)
) +
ggtitle("Consommation de temps sur les structures testées") +
ggsave("graph_time_hypo.png")
ggplot(perf,aes(OpSize,Memory)) +
geom_smooth() +
geom_point() +
facet_grid(
rows = vars(Type),
cols = vars(Operation)
) +
ggtitle("Consommation de mémoire sur les structures testées") +
ggsave("graph_memoire_hypo.png")
\ No newline at end of file
/**
Recherche d'un entier alétoire dans un tableau de valeurs aléatoires
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_VALEUR 15
int *generer_tableau(long long unsigned int n)
{
int *tableau = malloc(n*sizeof(int));
long long unsigned int i;
for (i=0; i<n; i++) {
tableau[i] = rand()%MAX_VALEUR;
}
return tableau;
}
void afficher_tableau(int *tableau, long long unsigned int n)
{
long long unsigned int i;
for (i=0; i<n; i++) {
printf("%d ",tableau[i]);
}
printf("\n");
}
long long unsigned int rechercher(int *tableau, long long unsigned int n, int valeur)
{
long long unsigned int i;
long long unsigned int trouve = -1;
for (i=0; i<n; i++) {
if (tableau[i] == valeur) {
trouve=i;
}
}
return trouve;
}
int main(int argc, char *argv[])
{
int *tableau;
int taille, valeur;
char trouve;
if (argc<2) {
printf("%s: opérande manquant\n",argv[0]);
printf("Recherche une valeur aléatoire dans un tableau d'entier aléatoire de taille n\n");
printf("Affiche le tableau et renvoie 1 si la valeur est trouvée, 0 sinon\n");
exit(1);
printf("Usage: %s taille [graine]\n",argv[0]);
}
unsigned int graine;
if (argc>2) {
graine = atoi(argv[2]);
} else {
graine = time(NULL);
}
srand(graine);
taille = strtoull(argv[1], (char **) NULL, 10);
valeur = rand()%MAX_VALEUR;
tableau = generer_tableau(taille);
afficher_tableau(tableau,taille);
trouve = rechercher(tableau, taille, valeur);
printf("Valeur %d trouvée: %u\n",valeur, trouve);
}
#!/bin/bash
structType[0]="ArrayList"
structType[1]="LinkedList"
structType[2]="HashSet"
sizeZ=500000
operationSize[0]=10000
operationSize[1]=20000
operationSize[2]=30000
operationSize[3]=40000
operationSize[4]=50000
operationType[0]="Ajout"
operationType[1]="Présence"
operationType[2]="Suppression"
cd ../src
/usr/bin/javac *.java
echo -e "Size\tOperation\tOpSize\tType\tTime\tMemory"
for operation in ${operationType[*]}; do
for size in ${operationSize[*]}; do
for type in ${structType[*]}; do
res=$((/usr/bin/time -f "\t%U\t%M" /usr/bin/java Main $type $size $operation) 2>&1)
echo -e "$sizeZ\t$operation\t$size\t$type\t$res"
done
done
done
cd ../graphs
./graphique.R
cd ../src
rm *.class
#!/bin/bash
structType[0]="ArrayList"
structType[1]="LinkedList"
structType[2]="HashSet"
sizeZ=500000
operationSize[0]=10000
operationSize[1]=20000
operationSize[2]=30000
operationSize[3]=40000
operationSize[4]=50000
operationType[0]="Ajout"
operationType[1]="Présence"
operationType[2]="Suppression"
cd ../src
/usr/bin/javac *.java
echo -e "Size\tOperation\tOpSize\tType\tTime\tMemory"
for operation in ${operationType[*]}; do
for size in ${operationSize[*]}; do
for type in ${structType[*]}; do
res=$((/usr/bin/time -f "\t%U\t%M" /usr/bin/java Hypothese $type $size $operation) 2>&1)
echo -e "$sizeZ\t$operation\t$size\t$type\t$res"
done
done
done
cd ../graphs
./graphique_hypothese.R
cd ../src
rm *.class
\ No newline at end of file
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
/**
* Hypothese
*/
public class Hypothese {
private static Collection list;
private static final int DEFAULT_COUNT = 500000;
public static Collection add(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.add(i);
}
return c;
}
public static void contains(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.contains(i);
}
}
public static void remove(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.remove(i);
}
}
public static void main(String[] args) {
if (args.length < 3) {
System.out.println("Usage : java Main StructureType Length \n");
System.exit(1);
}
switch (args[0]) {
default: {
list = new ArrayList<Integer>();
break;
}
case "LinkedList": {
list = new LinkedList<Integer>();
break;
}
case "HashSet": {
list = new HashSet<Integer>();
break;
}
}
int size = Integer.parseInt(args[1]);
switch (args[2]) {
default: {
add(list,size);
break;
}
case "Présence": {
contains(add(list, DEFAULT_COUNT), size);
break;
}
case "Suppression": {
remove(add(list, DEFAULT_COUNT), size);
break;
}
}
}
}
\ No newline at end of file
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Random;
public class Main {
private static Collection list;
private static Random r = new Random();
private static final int DEFAULT_COUNT = 500000;
public static Collection add(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.add(r.nextInt());
}
return c;
}
public static void contains(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.contains(i);
}
}
public static void remove(Collection c, int size) {
for (int i = 0; i < size; i++) {
c.remove(i);
}
}
public static void main(String[] args) {
r.setSeed(System.currentTimeMillis());
if (args.length < 3) {
System.out.println("Usage : java Main StructureType Length Operation\n");
System.exit(1);
}
//On récupère les paramètres (TypeDeStructure/Taille/Opération/TailleOp) :
String type = args[0];
int size = Integer.parseInt(args[1]);
String op = args[2];
//Création de la structure choisie (ArrayList, LinkedList ou HashSet) :
switch (type) {
default: {
list = new ArrayList<Integer>();
break;
}
case "LinkedList": {
list = new LinkedList<Integer>();
break;
}
case "HashSet": {
list = new HashSet<Integer>();
break;
}
}
//On effectue l'opération choisie (add, contains ou remove) :
switch (op) {
default: {
add(list,size);
break;
}
case "Présence": {
contains(add(list, DEFAULT_COUNT),size);
break;
}
case "Suppression": {
remove(add(list, DEFAULT_COUNT), size);
break;
}
}
}
}