/
main.cpp
229 lines (195 loc) · 5.74 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#include "algo2.cpp"
#include "algo1.cpp"
#include "algo3.cpp"
#include "generateur.cpp"
#include "fonction_temps.cpp"
#include <fstream>
int main(int argc, char *argv[]){
//Déclaration des variables
int taille=0; //Taille des chaînes (change à chaque paramètre)
double min; //Temps minimum observé
double max; //Temps maximum observé
double sum; //Temps total depuis le début de l'execution (par paramètre)
double time;//Temps d'une execution
int cpt; //Compteur de génération
char* S=NULL; //Chaîne à comparer
char* T=NULL; //Idem
int (*pfonction)(char*,char*,const int &); //Pointeur de fonction (algo1,2,3)
std::ifstream fichier; //Pointeur du fichier en cour de lecture (paramètre)
int ligne_courante=0; //Second curseur (virtuel) dans le fichier
bool sortie; //Condition de sortie de boucle en lecture de fichier
int cpt_argument=2; //Compteur de l'argument en cours de lecture
int facteur; //On répète facteur fois le même test entre le début et la fin du chronomètre, pour obtenir un temps >1ms
//Attribution de l'algorithme en fonction du premier paramètre (1,2,3)
switch (atoi(argv[1])){
case 1 : pfonction=&algo1;break;
case 2 : pfonction=&algo2;break;
case 3 : pfonction=&algo3;break;
default : std::cout<<"Algorithm "<<atoi(argv[1])<<" does not exist !\n"; return 0;break;
}
//On parcourt chaque argument (demande de jeux de tests)
while(cpt_argument<argc)
{
//INITIALISATION DES VARIABLES
cpt=0;
min=200000000; //min doit être plus grand que 3minutes (en ms)
max=-1; //Valeur impossible (min=0)
time=0;
sum=0;
sortie=false;
//Si la taille est passée en paramètre (génération aléatoire)
if(atoi(argv[cpt_argument])!=0)
{
taille=atoi(argv[cpt_argument]);
//Génération aléatoire
S=random_generate(taille,cpt);
T=random_generate(taille,cpt+1);
facteur=1;
/*
* Boucle déterminant le facteur minimum à appliquer pour obtenir des chronométrages >1ms
*/
do{
//Lancement du chronomètre
crono_start();
for(int i=0;i<facteur;i++)
{
//On effectue facteur fois la résolution
(*pfonction)(S,T,taille);
}
crono_stop();
//Si le temps de résolution est inférieur à 5ms, on multiplie par 10 le facteur
if(crono_ms()<5)
{
facteur*=10;
}
}
while(crono_ms()<5);
/*
* Fin de la boucle de recherche de facteur
*/
//On génère des chaînes aléatoires jusqu'à 3 minutes de temps total de résolution
while(sum<180*1000)
{
//Génération aléatoire
S=random_generate(taille,cpt);
T=random_generate(taille,cpt+1);
//Lancement du chronomètre
crono_start();
for(int i=0;i<facteur;i++)
{
(*pfonction)(S,T,taille);
}
crono_stop();
//Mise à jour des statistiques
time=crono_ms();
sum+=time;
if(time>max)
{
max=time;
}
if(time<min)
{
min=time;
}
cpt+=2; //Voir fonction random_generate pour plus de détails
//Libération de S et T (cf random_generate)
free(S);
free(T);
}
}//boucle d'argument===taille
//Sinon, si un fichier est passé en paramètre
else
{
//Ouverture du fichier
fichier.open(argv[cpt_argument]);
//Contrôle de l'ouverture
if(fichier)
{
//Récupération de la taille des chaînes en première ligne
fichier>>taille;
S=(char*)malloc(taille*sizeof(char));
S[0]=' ';
T=(char*)malloc(taille*sizeof(char));
T[0]=' ';
//Récupération de la première chaine
fichier>>&S[1];
//Sauvegarde de la position (curseur virtuel)
ligne_courante=fichier.tellg();
//Recopie de S dans T pour la première comparaison
strcpy(T,S);
/*
* Détermination du facteur minimum
*/
facteur=1;
do{
crono_start();
for(int i=0;i<facteur;i++)
{
(*pfonction)(S,T,taille);
}
crono_stop();
//std::cout<<"facteur="<<facteur<<" crono="<<crono_ms()<<"\n";//@DEBUG
if(crono_ms()<5)
{
facteur*=10;
}
}
while(crono_ms()<5);
//Tant que toutes les chaînes n'ont pas été parcourues
while(!sortie)
{
//On résoud toutes les paires possibles du fichier
//Si le pointeur de "T" arrive à la fin du fichier
if(fichier.eof())
{
//On avance S d'une ligne
fichier.clear();
fichier.seekg(ligne_courante);
fichier>>&S[1];
strcpy(T,S);
//Condition d'arrêt du programme : les pointeurs S et T sont à la fin du fichier
if(fichier.eof())
{
sortie=true;break;
}
//On repart à partir de la ligne suivante
ligne_courante=fichier.tellg();
}
//Résolution
crono_start();
for(int i=0;i<facteur;i++)
{
(*pfonction)(S,T,taille);
}
crono_stop();
//Mise à jour des statistiques
time=crono_ms();
sum+=time;
if(time>max)
{
max=time;
}
if(time<min)
{
min=time;
}
cpt+=2;
fichier>>&T[1];
}
//On libère S et T uniquement à la fin
free(S);
free(T);
fichier.close();
}
else //ERREUR D'OUVERTURE DE FICHIER
{
std::cout<<"Wrong file input !\n";
return 0;
}
}//boucle d'argument===fichier
//Impression des statistiques
std::cout<<"******************\ntaille = "<<taille<<"\nminimum="<<min<<"ms \nmaximum="<<max<<"ms \nmoyen="<<sum/(cpt/2)<<"ms \ntotal="<<sum<<"ms \nnb_tests="<<cpt/2<<" \nfacteur="<<facteur<<"\n******************\n\n";
cpt_argument++;
}//Boucle sur les arguments
return 0;
}//main