From e9382975732d4890f966fb10ac4e4ad947a5a6c0 Mon Sep 17 00:00:00 2001 From: david <david@lipn.fr> Date: Mon, 9 Sep 2019 14:36:51 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20analyse=20de=20l'espace=20m?= =?UTF-8?q?=C3=A9moire=20inutilis=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TP1/C/arraylist.c | 6 +++++- TP1/C/arraylist.h | 10 +++++++++- TP1/C/main.c | 10 ++++++++-- TP1/CPP/arraylist.hpp | 9 ++++++++- TP1/CPP/main.cpp | 7 ++++++- TP1/Java/ArrayListProxy.java | 11 ++++++++++- TP1/Java/Main.java | 6 +++++- 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/TP1/C/arraylist.c b/TP1/C/arraylist.c index f77a800..32d45a6 100644 --- a/TP1/C/arraylist.c +++ b/TP1/C/arraylist.c @@ -51,10 +51,14 @@ int arraylist_get(arraylist_t * a, int pos){ return -1; } -size_t arraylist_get_size(arraylist_t * a){ +size_t arraylist_size(arraylist_t * a){ return ( a!=NULL) ? a->size : -1; } +size_t arraylist_capacity(arraylist_t * a){ + return ( a!=NULL) ? a->capacity : -1; +} + char arraylist_do_we_need_to_enlarge_capacity(arraylist_t * a){ return ( a->size >= (a->capacity * 3)/4 )? TRUE: FALSE; } diff --git a/TP1/C/arraylist.h b/TP1/C/arraylist.h index 26dd805..0f4a12b 100644 --- a/TP1/C/arraylist.h +++ b/TP1/C/arraylist.h @@ -70,7 +70,15 @@ int arraylist_get(arraylist_t * a, int pos); @param a est un pointeur vers un tableau. @returns le nombre d'éléments stockés dans le tableau. */ -size_t arraylist_get_size(arraylist_t * a); +size_t arraylist_size(arraylist_t * a); + +/** + Renvoie la capacité de stockage du tableau. + Complexité en temps/espace, pire cas : O(1) + @param a est un pointeur vers un tableau. + @returns la capacité de stockage du tableau. + */ +size_t arraylist_capacity(arraylist_t * a); /** Cette fonction détermine la règle selon laquelle un espace mémoire plus grand sera alloué ou non. diff --git a/TP1/C/main.c b/TP1/C/main.c index 35eeefb..43523a4 100644 --- a/TP1/C/main.c +++ b/TP1/C/main.c @@ -12,7 +12,9 @@ int main(int argc, char ** argv){ // Analyse du temps pris par les opérations. analyzer_t * time_analysis = analyzer_create(); // Analyse du nombre de copies faites par les opérations. - analyzer_t * copy_analysis = analyzer_create(); + analyzer_t * copy_analysis = analyzer_create(); + // Analyse de l'espace mémoire inutilisé. + analyzer_t * memory_analysis = analyzer_create(); struct timespec before, after; // utilisé comme booléen pour savoir si une allocation a été effectuée. char memory_allocation; @@ -28,6 +30,8 @@ int main(int argc, char ** argv){ // Enregistrement du nombre de copies efféctuées par l'opération. // S'il y a eu réallocation de mémoire, il a fallu recopier tout le tableau. analyzer_append(copy_analysis, (memory_allocation)? i:1 ); + // Enregistrement de l'espace mémoire non-utilisé. + analyzer_append(memory_analysis,arraylist_capacity(a)-arraylist_size(a)); } // Affichage de quelques statistiques sur l'expérience. @@ -36,13 +40,15 @@ int main(int argc, char ** argv){ fprintf(stderr, "Variance: %lf\n", get_variance(time_analysis)); fprintf(stderr, "Standard deviation: %lf\n", get_standard_deviation(time_analysis)); - // Sauvegarde les données de l'expérience: temps et nombre de copies effectuées par opération. + // Sauvegarde les données de l'expérience. save_values(time_analysis, "../dynamic_array_time_c.plot"); save_values(copy_analysis, "../dynamic_array_copy_c.plot"); + save_values(memory_analysis, "../dynamic_array_memory_c.plot"); // Nettoyage de la mémoire avant la sortie du programme arraylist_destroy(a); analyzer_destroy(time_analysis); analyzer_destroy(copy_analysis); + analyzer_destroy(memory_analysis); return EXIT_SUCCESS; } diff --git a/TP1/CPP/arraylist.hpp b/TP1/CPP/arraylist.hpp index 9f4d5d6..fdc667c 100644 --- a/TP1/CPP/arraylist.hpp +++ b/TP1/CPP/arraylist.hpp @@ -71,8 +71,15 @@ public: Complexité en temps/espace, pire cas : O(1) @returns le nombre d'éléments stockés dans le tableau. */ - const size_t get_size(){ return data.size(); } + const size_t size(){ return data.size(); } + /** + Renvoie la capacité de stockage du tableau. + Complexité en temps/espace, pire cas : O(1) + @returns le nombre d'éléments stockés dans le tableau. + */ + const size_t capacity(){ return data.capacity(); } + private: // Vecteur contenant les données. std::vector<P> data; diff --git a/TP1/CPP/main.cpp b/TP1/CPP/main.cpp index 4907713..ede756d 100644 --- a/TP1/CPP/main.cpp +++ b/TP1/CPP/main.cpp @@ -13,6 +13,8 @@ int main(int argc, char ** argv){ Analyzer time_analysis; // Analyse du nombre de copies faites par les opérations. Analyzer copy_analysis; + // Analyse de l'espace mémoire inutilisé. + Analyzer memory_analysis; struct timespec before, after; // Booléen permettant de savoir si une allocation a été effectuée. bool memory_allocation; @@ -28,6 +30,8 @@ int main(int argc, char ** argv){ // Enregistrement du nombre de copies efféctuées par l'opération. // S'il y a eu réallocation de mémoire, il a fallu recopier tout le tableau. copy_analysis.append( (memory_allocation)? i:1 ); + // Enregistrement de l'espace mémoire non-utilisé. + memory_analysis.append( a.capacity() - a.size() ); } // Affichage de quelques statistiques sur l'expérience. @@ -36,9 +40,10 @@ int main(int argc, char ** argv){ std::cerr<<"Variance :"<<time_analysis.get_variance()<<std::endl; std::cerr<<"Standard deviation :"<<time_analysis.get_standard_deviation()<<std::endl; - // Sauvegarde les données de l'expérience: temps et nombre de copies effectuées par opération. + // Sauvegarde les données de l'expérience. time_analysis.save_values("../dynamic_array_time_cpp.plot"); copy_analysis.save_values("../dynamic_array_copy_cpp.plot"); + memory_analysis.save_values("../dynamic_array_memory_cpp.plot"); return 0; } diff --git a/TP1/Java/ArrayListProxy.java b/TP1/Java/ArrayListProxy.java index f2d7bbc..e71393b 100644 --- a/TP1/Java/ArrayListProxy.java +++ b/TP1/Java/ArrayListProxy.java @@ -67,10 +67,19 @@ public class ArrayListProxy<T> { Complexité en temps/espace, pire cas : O(1) @returns le nombre d'éléments stockés dans le tableau. */ - int get_size(){ + int size(){ return data.size(); } + /** + Renvoie la capacité de stockage du tableau. + Complexité en temps/espace, pire cas : O(1) + @returns le nombre d'éléments stockés dans le tableau. + */ + int capacity(){ + return capacity; + } + /** Cette fonction détermine la règle selon laquelle un espace mémoire plus grand sera alloué ou non. @returns true si le tableau doit être agrandi, false sinon. diff --git a/TP1/Java/Main.java b/TP1/Java/Main.java index f504dd5..2b138c0 100644 --- a/TP1/Java/Main.java +++ b/TP1/Java/Main.java @@ -10,6 +10,8 @@ public class Main { Analyzer time_analysis = new Analyzer(); // Analyse du nombre de copies faites par les opérations. Analyzer copy_analysis = new Analyzer(); + // Analyse de l'espace mémoire inutilisé. + Analyzer memory_analysis = new Analyzer(); long before, after; // Booléen permettant de savoir si une allocation a été effectuée. boolean memory_allocation; @@ -26,6 +28,8 @@ public class Main { // Enregistrement du nombre de copies efféctuées par l'opération. // S'il y a eu réallocation de mémoire, il a fallu recopier tout le tableau. copy_analysis.append( (memory_allocation == true)? i: 1); + // Enregistrement de l'espace mémoire non-utilisé. + memory_analysis.append( a.capacity() - a.size() ); } // Affichage de quelques statistiques sur l'expérience. @@ -37,6 +41,6 @@ public class Main { // Sauvegarde les données de l'expérience: temps et nombre de copies effectuées par opération. time_analysis.save_values("../dynamic_array_time_java.plot"); copy_analysis.save_values("../dynamic_array_copy_java.plot"); - + memory_analysis.save_values("../dynamic_array_memory_java.plot"); } } -- GitLab