Commit e9382975 authored by david's avatar david
Browse files

Ajout d'une analyse de l'espace mémoire inutilisé

parent c4eb46fc
...@@ -51,10 +51,14 @@ int arraylist_get(arraylist_t * a, int pos){ ...@@ -51,10 +51,14 @@ int arraylist_get(arraylist_t * a, int pos){
return -1; return -1;
} }
size_t arraylist_get_size(arraylist_t * a){ size_t arraylist_size(arraylist_t * a){
return ( a!=NULL) ? a->size : -1; 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){ char arraylist_do_we_need_to_enlarge_capacity(arraylist_t * a){
return ( a->size >= (a->capacity * 3)/4 )? TRUE: FALSE; return ( a->size >= (a->capacity * 3)/4 )? TRUE: FALSE;
} }
......
...@@ -70,7 +70,15 @@ int arraylist_get(arraylist_t * a, int pos); ...@@ -70,7 +70,15 @@ int arraylist_get(arraylist_t * a, int pos);
@param a est un pointeur vers un tableau. @param a est un pointeur vers un tableau.
@returns le nombre d'éléments stockés dans le 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. Cette fonction détermine la règle selon laquelle un espace mémoire plus grand sera alloué ou non.
......
...@@ -12,7 +12,9 @@ int main(int argc, char ** argv){ ...@@ -12,7 +12,9 @@ int main(int argc, char ** argv){
// Analyse du temps pris par les opérations. // Analyse du temps pris par les opérations.
analyzer_t * time_analysis = analyzer_create(); analyzer_t * time_analysis = analyzer_create();
// Analyse du nombre de copies faites par les opérations. // 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; struct timespec before, after;
// utilisé comme booléen pour savoir si une allocation a été effectuée. // utilisé comme booléen pour savoir si une allocation a été effectuée.
char memory_allocation; char memory_allocation;
...@@ -28,6 +30,8 @@ int main(int argc, char ** argv){ ...@@ -28,6 +30,8 @@ int main(int argc, char ** argv){
// Enregistrement du nombre de copies efféctuées par l'opération. // 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. // 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 ); 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. // Affichage de quelques statistiques sur l'expérience.
...@@ -36,13 +40,15 @@ int main(int argc, char ** argv){ ...@@ -36,13 +40,15 @@ int main(int argc, char ** argv){
fprintf(stderr, "Variance: %lf\n", get_variance(time_analysis)); fprintf(stderr, "Variance: %lf\n", get_variance(time_analysis));
fprintf(stderr, "Standard deviation: %lf\n", get_standard_deviation(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(time_analysis, "../dynamic_array_time_c.plot");
save_values(copy_analysis, "../dynamic_array_copy_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 // Nettoyage de la mémoire avant la sortie du programme
arraylist_destroy(a); arraylist_destroy(a);
analyzer_destroy(time_analysis); analyzer_destroy(time_analysis);
analyzer_destroy(copy_analysis); analyzer_destroy(copy_analysis);
analyzer_destroy(memory_analysis);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
...@@ -71,8 +71,15 @@ public: ...@@ -71,8 +71,15 @@ public:
Complexité en temps/espace, pire cas : O(1) Complexité en temps/espace, pire cas : O(1)
@returns le nombre d'éléments stockés dans le tableau. @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: private:
// Vecteur contenant les données. // Vecteur contenant les données.
std::vector<P> data; std::vector<P> data;
......
...@@ -13,6 +13,8 @@ int main(int argc, char ** argv){ ...@@ -13,6 +13,8 @@ int main(int argc, char ** argv){
Analyzer time_analysis; Analyzer time_analysis;
// Analyse du nombre de copies faites par les opérations. // Analyse du nombre de copies faites par les opérations.
Analyzer copy_analysis; Analyzer copy_analysis;
// Analyse de l'espace mémoire inutilisé.
Analyzer memory_analysis;
struct timespec before, after; struct timespec before, after;
// Booléen permettant de savoir si une allocation a été effectuée. // Booléen permettant de savoir si une allocation a été effectuée.
bool memory_allocation; bool memory_allocation;
...@@ -28,6 +30,8 @@ int main(int argc, char ** argv){ ...@@ -28,6 +30,8 @@ int main(int argc, char ** argv){
// Enregistrement du nombre de copies efféctuées par l'opération. // 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. // S'il y a eu réallocation de mémoire, il a fallu recopier tout le tableau.
copy_analysis.append( (memory_allocation)? i:1 ); 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. // Affichage de quelques statistiques sur l'expérience.
...@@ -36,9 +40,10 @@ int main(int argc, char ** argv){ ...@@ -36,9 +40,10 @@ int main(int argc, char ** argv){
std::cerr<<"Variance :"<<time_analysis.get_variance()<<std::endl; std::cerr<<"Variance :"<<time_analysis.get_variance()<<std::endl;
std::cerr<<"Standard deviation :"<<time_analysis.get_standard_deviation()<<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"); time_analysis.save_values("../dynamic_array_time_cpp.plot");
copy_analysis.save_values("../dynamic_array_copy_cpp.plot"); copy_analysis.save_values("../dynamic_array_copy_cpp.plot");
memory_analysis.save_values("../dynamic_array_memory_cpp.plot");
return 0; return 0;
} }
...@@ -67,10 +67,19 @@ public class ArrayListProxy<T> { ...@@ -67,10 +67,19 @@ public class ArrayListProxy<T> {
Complexité en temps/espace, pire cas : O(1) Complexité en temps/espace, pire cas : O(1)
@returns le nombre d'éléments stockés dans le tableau. @returns le nombre d'éléments stockés dans le tableau.
*/ */
int get_size(){ int size(){
return data.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. 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. @returns true si le tableau doit être agrandi, false sinon.
......
...@@ -10,6 +10,8 @@ public class Main { ...@@ -10,6 +10,8 @@ public class Main {
Analyzer time_analysis = new Analyzer(); Analyzer time_analysis = new Analyzer();
// Analyse du nombre de copies faites par les opérations. // Analyse du nombre de copies faites par les opérations.
Analyzer copy_analysis = new Analyzer(); Analyzer copy_analysis = new Analyzer();
// Analyse de l'espace mémoire inutilisé.
Analyzer memory_analysis = new Analyzer();
long before, after; long before, after;
// Booléen permettant de savoir si une allocation a été effectuée. // Booléen permettant de savoir si une allocation a été effectuée.
boolean memory_allocation; boolean memory_allocation;
...@@ -26,6 +28,8 @@ public class Main { ...@@ -26,6 +28,8 @@ public class Main {
// Enregistrement du nombre de copies efféctuées par l'opération. // 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. // 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); 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. // Affichage de quelques statistiques sur l'expérience.
...@@ -37,6 +41,6 @@ public class Main { ...@@ -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. // 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"); time_analysis.save_values("../dynamic_array_time_java.plot");
copy_analysis.save_values("../dynamic_array_copy_java.plot"); copy_analysis.save_values("../dynamic_array_copy_java.plot");
memory_analysis.save_values("../dynamic_array_memory_java.plot");
} }
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment