diff --git a/CPP/arraylist.hpp b/CPP/arraylist.hpp index be35de5b38dca78d5e8db1f6f527803170eae387..3a56514efc786379fc791b7ae48606f0f3acc26c 100644 --- a/CPP/arraylist.hpp +++ b/CPP/arraylist.hpp @@ -48,8 +48,8 @@ public: bool memory_reduction = false; if(!data.empty()){ if( do_we_need_to_reduce_capacity() ){ - memory_reduction = true; - reduce_capacity(); + memory_reduction = true; + reduce_capacity(); } data.pop_back(); } diff --git a/Java/Main.java b/Java/Main.java index 2ee8b2e4ad4b51c88f2116b6a00889e2ee3eda84..4f0dac33e3cf5ee6feef544bda157d41146e64d5 100644 --- a/Java/Main.java +++ b/Java/Main.java @@ -10,8 +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(); + // 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; diff --git a/Python/arraylist.py b/Python/arraylist.py deleted file mode 100644 index c0a95c9d04ecdff0bb5551e3415227d0e8d64f18..0000000000000000000000000000000000000000 --- a/Python/arraylist.py +++ /dev/null @@ -1,28 +0,0 @@ -# Cette classe est un simple proxy vers le type "list" de python -# Le langage ne permettant pas de manipuler l'espace memoire d'une "list", -# on se contente ici d'observer son comportement. -class ArrayListProxy: - # Constructeur de la classe ArraylistProxy - def __init__(self): - self.data = [] - - # Ajoute l'element x au tableau - # Complexite en temps/espace, pire cas : O(data.size) - # Complexite en temps/espace, meilleur cas : O(1) - # Complexite amortie : O(1) - def append(self, x): - self.data.append(x) - - # Supprime le dernier element du tableau - def pop_back(self): - self.data.pop() - - # Renvoie l'element situe a la position 'pos' dans le tableau - def get(self, pos): - return self.data[pos] - - # Renvoie le nombre d'elements dans le tableau - def get_size(self): - return len(data) - - diff --git a/Python/main.py b/Python/main.py index e999e9975e55f55e72cd236d91d91b3d5bdbb4fd..54d4af6291d8343c5c06706e16a302b59814db7e 100644 --- a/Python/main.py +++ b/Python/main.py @@ -1,20 +1,42 @@ import time import sys -from arraylist import ArrayListProxy from analyzer import Analyzer # Tableau dynamique. a = [] # Analyse du temps pris par les operations. time_analysis = Analyzer(); +# Analyse de la mémoire gaspillée à un instant t. +memory_analysis = Analyzer(); +# Analyse de la mémoire gaspillée à un instant t. +copy_analysis = Analyzer(); + + +# Taille supposée de l'en-tête d'une list en Python +__list_header_size__ = 64 +# Taille supposée d'une entrée dans une list en Python +__list_entry_size__ = 8 + +wasted_memory = sys.getsizeof(a)-__list_header_size__ for i in range(1000000): before = time.time() a.append(i) after = time.time() + # Enregistrement du temps pris par l'operation time_analysis.append((after - before)*10**9) + # Enregistrement du nombre de copie effectuées par l'opération + # S'il n'y avait pas d'espace gaspillé à l'étape précédente, + # alors une réallocation a eu lieu à cette étape. + if wasted_memory == 0: + copy_analysis.append(i+1) + else: + copy_analysis.append(1) + # Enregistrement de l'espace mémoire gaspillé à un instant donné + wasted_memory = sys.getsizeof(a)-__list_header_size__ - __list_entry_size__*i + memory_analysis.append(wasted_memory) # Affichage de quelques statistiques sur l'experience. sys.stderr.write("Total cost : " + str(time_analysis.get_total_cost())+"\n") @@ -24,3 +46,5 @@ sys.stderr.write("Standard deviation :" + str(time_analysis.get_standard_deviati # Sauvegarde les donnees de l'experience. time_analysis.save_values("../plots/dynamic_array_time_python.plot") +memory_analysis.save_values("../plots/dynamic_array_memory_python.plot") +copy_analysis.save_values("../plots/dynamic_array_copy_python.plot") diff --git a/plots/plot_result b/plots/plot_result index 1035e00985b687a66c7cd2321a135d1b59fcff99..9561c6c94d25bba7ad0a11c5a13aa4ab80245145 100644 --- a/plots/plot_result +++ b/plots/plot_result @@ -1,6 +1,6 @@ # Script GNUPLOT # Dire que le fichier de sortie est un fichier Postscript -set terminal postscript color +set terminal pdf color set xlabel "Nombre d'elements ajoutes" font "Helvetica,24" @@ -12,28 +12,28 @@ set xlabel "Nombre d'elements ajoutes" font "Helvetica,24" set ylabel "Temps amorti" font "Helvetica,24" # Nom du fichier Postscript en sortie -set output 'eps/dynamic_array_amortized_time_alpha_2.eps' +set output 'pdf/dynamic_array_amortized_time_alpha_2.pdf' -plot [0:1000000][0:1000] 'dynamic_array_time_c.plot' using 1:3 w lines title "Amortized C", 'dynamic_array_time_cpp.plot' using 1:3 w lines title "Amortized C++", 'dynamic_array_time_java.plot' using 1:3 w lines title "Amortized JAVA", 'dynamic_array_time_python.plot' using 1:3 w lines title "Amortized Python" +plot [0:1000000][0:600] 'dynamic_array_time_c.plot' using 1:3 w lines title "Amortized C", 'dynamic_array_time_cpp.plot' using 1:3 w lines title "Amortized C++", 'dynamic_array_time_java.plot' using 1:3 w lines title "Amortized JAVA", 'dynamic_array_time_python.plot' using 1:3 w lines title "Amortized Python" ############################################################### ########### Affichage de l'espace mémoire gaspillé ########### ############################################################### # Titre de l'axe des ordonnées -set ylabel "Mémoire gaspillée" font "Helvetica,24" +set ylabel "Memoire gaspillee" font "Helvetica,24" # Nom du fichier Postscript en sortie -set output 'eps/dynamic_array_wasted_memory_alpha_2.eps' +set output 'pdf/dynamic_array_wasted_memory_alpha_2.pdf' -plot 'dynamic_array_memory_c.plot' using 1:2 w lines title "Espace memoire inutilise" +plot 'dynamic_array_memory_c.plot' using 1:2 w lines title "Espace memoire inutilise C", 'dynamic_array_memory_python.plot' using 1:2 w lines title "Espace memoire inutilise Python" ################################################################# ########### Affichage du nombre de copies effectuées ########### ################################################################# # Titre de l'axe des ordonnées -set ylabel "Nombre de copie effectuée" font "Helvetica,24" +set ylabel "Nombre de copies effectuees" font "Helvetica,24" # Nom du fichier Postscript en sortie -set output 'eps/dynamic_copy_alpha_2.eps' +set output 'pdf/dynamic_array_copy_alpha_2.pdf' -plot 'dynamic_array_copy_c.plot' using 1:2 w boxes title "Nombre de copies de valeurs effectuees" \ No newline at end of file +plot 'dynamic_array_copy_c.plot' using 1:2 w boxes title "Nombre de copies de valeurs effectuees C", 'dynamic_array_copy_python.plot' using 1:2 w boxes title "Nombre de copies de valeurs effectuees Python" \ No newline at end of file