CLASSE (OPTIMISÉE... :P) POUR MANIPULER LES TRÈS GRANDS ENTIERS
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003
-
22 mai 2003 à 23:32
StanOfSky
Messages postés43Date d'inscriptionmardi 30 mars 2004StatutMembreDernière intervention 7 octobre 2006
-
4 mai 2004 à 01:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
StanOfSky
Messages postés43Date d'inscriptionmardi 30 mars 2004StatutMembreDernière intervention 7 octobre 2006 4 mai 2004 à 01:17
c le top, moi qui voulait tester quelques algos de cryptages ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 17 nov. 2003 à 22:58
Visual Studio comme d'hab va impec.
nadfri
Messages postés9Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention19 novembre 2003 17 nov. 2003 à 22:46
Quand j'essaie de le compiler avec dev c++ 4, il me sort des erreurs de int out of range, vous le compiler avec koi vous?
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 26 mai 2003 à 23:18
(NB: le choix d'un axiome ne peut être remis en question vu qu'il s'agit justement d'un axiome !!!)
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 26 mai 2003 à 23:06
ben pour le constructeur a partir d'une chaine de caractere, c'est un choix... ca "devrait" donner, c'est ton critere... 987p654" devrait donner 987. Mais il donne 987654, faux... c'est faux pour toi... moi je dis on construit l'entier a partir des caracteres qui representent des chiffres en ignorant les autres. de toutes manieres, ca ne sert que pour l'initialisation! donc, a priori, la gestion de chaines invalides a peu d'interet (si on entre "105p151", on voulait sans doute initialiser avec 105x151, ou x est un chiffre, mais certainement pas avec 105..)
voila tout depend de ta notion du faux...
cs_nEUrOne
Messages postés41Date d'inscriptiondimanche 17 novembre 2002StatutMembreDernière intervention14 avril 2004 26 mai 2003 à 17:07
Excellent ... tout simplement ..
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 mai 2003 à 16:47
pour very_long_int::very_long_int(char* source)
version C++ refaite, ASM fait 5 fois + vite.
Juste que j'ai du derouler toutes boucles donc 209 lignes de code.
ciao...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 26 mai 2003 à 16:29
very_long_int::very_long_int(char* source)
faudrait revoir car
vli = "987p654" devrait donner 987.
Mais il donne 987654, faux.
very_long_int::very_long_int(char* source)
{
char *c = source;
*this = 0;
while(*c >= 48 && *c <= 57) {
*this *= 10;
*this += (*c - 48);
c++;
}
}
comme cela va donner juste.
ciao...
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 25 mai 2003 à 14:35
ben je savais deja que ces appels au consctructeur etaient negligeables devant le temps de la division elle meme, mais voila, ils etaient inutiles...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 25 mai 2003 à 14:10
par rdtsc, ticks nouvelle version, 4 tests.
boucles de 1000 iterations.
33385524916
32497783260
31983368860
32400000000
ticks ancienne version, moyenne sur 4
34369641228
ticks version ASM
10775374480
Comme tu vois, progression inferieure a 1% de ancienne a nouvelle.
Sera difficile aller au dela si on respecte le droit canon de la POO.
Info: fais gaffe, tu as oublie de remettre en service ta stringD dans le h.
ciao...
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 25 mai 2003 à 13:34
bonne remarque !! il y avait surtout des appels inutiles au constructeur dans la méthode division. j'ai updaté la source pour arranger ca.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 25 mai 2003 à 09:35
quand tu passes un param 10 comme dans division(), il est declare en classe donc appel constructeur a chaque tour, ainsi que x, y et r. Il est clair que tu n'es pas responsable, c'est le principe de la prog objet qui trouve ses limites dans la perf.
Pour ce qui est du code ASM equivalent sur le net, je ne sais pas mais j'ai refait moi meme la stringD en ASM dans une dll pour effectuer les tests. Je conserve les progs comparatifs, si veux pousser plus avant tu me contactes.
ciao...
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 25 mai 2003 à 00:19
sinon existe il quelque par sur le net un code ecrit en ASM qui gere justement les gds entiers? vu qu'en fait j'ai fait la classe la par besoin, mais si un truc meilleur existe ailleurs...
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 25 mai 2003 à 00:16
j'comprends pas la remarque la... quand on appelle une méthode amie, on alloue rien du tout non ? note aussi que quand on fait des tests, on peut parfois obtenir des temps differents que les temps usuels, ceci de maniere assez aleatoire...(on peut parfois multiplier le temps par 4 ou 5, phenomene restant cependant marginal)
ou, dans une classe, aloue - t - on plus de trucs que ds une structure?? (j'suis pas un boss de la programmation orienté objet, j'avoue..)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 24 mai 2003 à 21:57
Salut,
bon travail pour une classe mais toute optimisation est vaine par le fait meme que c'est une classe. Allocs et desallocs prennet les 3/4 du temps employe. J'ai fait des tests avec VLI2StringD, on divise le temps par un peu plus de 3 en mettant sous forme de struct au lieu de classe. Je pense qu'on continuera a ecrire les bibli maths en C et ASM encore un bon moment.
ciao...
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 24 mai 2003 à 00:06
de sauver la vie des gens ? jai pa pigé ! :p
cs_chmod777
Messages postés46Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention 2 décembre 20061 23 mai 2003 à 23:22
ça t'amuse de sauver la vie des gens, comme ça? lol
merci et bravo
gordhan
Messages postés19Date d'inscriptionlundi 3 février 2003StatutMembreDernière intervention10 juin 2003 22 mai 2003 à 23:32
ha j'ai oublié de dire, cé une classe d'entiers non signés! par contre ca gere la soustraction, mais si vous faites a - b avec a plus petit que b, ca va donne la valeur de a-b modulo 2^512 (ou autre chose si vous avez changé le #define VLINT_SIZE)
ceci permet d'avoir (a-b)+b = a, meme si a est plus petit que b
voila ;)
4 mai 2004 à 01:17
17 nov. 2003 à 22:58
17 nov. 2003 à 22:46
26 mai 2003 à 23:18
26 mai 2003 à 23:06
voila tout depend de ta notion du faux...
26 mai 2003 à 17:07
26 mai 2003 à 16:47
version C++ refaite, ASM fait 5 fois + vite.
Juste que j'ai du derouler toutes boucles donc 209 lignes de code.
ciao...
26 mai 2003 à 16:29
faudrait revoir car
vli = "987p654" devrait donner 987.
Mais il donne 987654, faux.
very_long_int::very_long_int(char* source)
{
char *c = source;
*this = 0;
while(*c >= 48 && *c <= 57) {
*this *= 10;
*this += (*c - 48);
c++;
}
}
comme cela va donner juste.
ciao...
25 mai 2003 à 14:35
25 mai 2003 à 14:10
boucles de 1000 iterations.
33385524916
32497783260
31983368860
32400000000
ticks ancienne version, moyenne sur 4
34369641228
ticks version ASM
10775374480
Comme tu vois, progression inferieure a 1% de ancienne a nouvelle.
Sera difficile aller au dela si on respecte le droit canon de la POO.
Info: fais gaffe, tu as oublie de remettre en service ta stringD dans le h.
ciao...
25 mai 2003 à 13:34
25 mai 2003 à 09:35
Pour ce qui est du code ASM equivalent sur le net, je ne sais pas mais j'ai refait moi meme la stringD en ASM dans une dll pour effectuer les tests. Je conserve les progs comparatifs, si veux pousser plus avant tu me contactes.
ciao...
25 mai 2003 à 00:19
25 mai 2003 à 00:16
ou, dans une classe, aloue - t - on plus de trucs que ds une structure?? (j'suis pas un boss de la programmation orienté objet, j'avoue..)
24 mai 2003 à 21:57
bon travail pour une classe mais toute optimisation est vaine par le fait meme que c'est une classe. Allocs et desallocs prennet les 3/4 du temps employe. J'ai fait des tests avec VLI2StringD, on divise le temps par un peu plus de 3 en mettant sous forme de struct au lieu de classe. Je pense qu'on continuera a ecrire les bibli maths en C et ASM encore un bon moment.
ciao...
24 mai 2003 à 00:06
23 mai 2003 à 23:22
merci et bravo
22 mai 2003 à 23:32
ceci permet d'avoir (a-b)+b = a, meme si a est plus petit que b
voila ;)