trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 2003
-
31 janv. 2003 à 19:26
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007
-
22 mars 2010 à 09:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007 22 mars 2010 à 09:46
T'as raison :-)
5 ans de retard désormais !!!! :-P
Je vais me mettre au Cobol et poster une réponse dans 12 ans. Puis au fortran et poster dans 20 ans ?
Tu seras toujours la ? :-D
Sinon, j'ai eu un cas récent d'utilisation de la méthode XOR sur un PIC ou la mémoire ET les registres sont comptés sur LE doigt de la main.
Economiser un octet ou un registre peu parfois être très confortable. Sur un RISC, c'est aussi rapide qui plus est.
Lol, qui relèvera le défit de répondre once again :-) ?
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 9 oct. 2005 à 22:41
et pourquoi pas l'ecrire en cobol ou en fortran pendant que t'y est ? ;)
(t'as 2 ans et 3 mois de retard :P)
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007 7 oct. 2005 à 14:54
// Héhé, encore les templates si on passe en C++
// ca donne ça et ça marche pour tout !
// J'aime po les macros.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 8 juil. 2003 à 19:23
heu... le code que j'avais utiliser n'est pas si specifique, il emane du rfc de base donc tu pourra le trouver partout, cherche sur google, tu verra que tu ne trouvera pas qu'un seul site ayant le meme code...
cs_NiFF
Messages postés92Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention24 juin 2004 8 juil. 2003 à 12:40
Comme dis plus haut, ce code est très global (même LOGIN: l'a publié), contrairement au tiens qui vient sans aucun doute possible de ce site. Tu remarqueras d'ailleurs qu'ils n'ont pas surchargé les opérateurs. En ce qui concerne la rapidité, il faudrait comparer les XOR et le XCHNG en asm.
Pour le bug avec 0, je ne sais plus trop où il était.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 8 juil. 2003 à 04:06
sinon je n'aime pas trop les gents qui ecrivent un algo comme des porc et qui ensuite disent : "ahh, regarder comme c'est degueulasse, c'est cool non ?"
ceci est tres propre, et tres fonctionnel, de plus, je ne sais pas comment tu t'y es pris mais je n'ai pas le bug avec le zero dans une variable
trintacts, je pense quil est fort bien quil y ai peut de commentaire dans un code, justement, du commentaire dans un code ne contribue qu'a le salir d'avantage, un code bien ecrit ne necessite pas de commentaire, il parle de lui meme
de plus niff, ce contenter de ne pas gagner qqes microseconde est une bien grosse erreur car lorsque que tu fera ce genre d'operation des millions de fois par secondes, comptes le nombre de temps que tu pourrais gagner, meme un cycle d'horloge est toujours bon a gratter :)
golden-eye, te referer aux doc d'intel est vain, ce n'est pas en cherchant les cycle d'horloge des instructions asm que tu trouvera des reponses, il faut faire des tests sur le terrain
il a ete demontrer a maintes reprises que des instructions plus courtes que d'autre en temps cpu s'avairais plus longues car elle faisais appel a des fonctionnaliters plus lentes du sytemes, mais ca, je te laisse en discuter avec tes amis de ASM-France, ce genre de conversation n'as pas ca place ici, et je suis desoler d'en avoir mis
cs_NiFF
Messages postés92Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention24 juin 2004 17 avril 2003 à 12:18
Ha y'a un bug!
Si une des deux varaibles est à zéro, lorsque l'on fait a^=0 cela met les deux variables à zéro.
Sinon GoldenEye toi qui ramène ton code asm tu connais pas XCHG eax, ebx ?
cs_GoldenEye
Messages postés527Date d'inscriptionvendredi 14 septembre 2001StatutMembreDernière intervention 6 octobre 20084 4 févr. 2003 à 20:22
nEUrOne => on s'en fout de la notation, ce sont les opérations effectuées qui sont importantes. T'es à côté du sujet, je ne propose pas une implémentation, c'est juste un désassemblage. Si tu veux je peux te le faire en ASM 68000...
cs_nEUrOne
Messages postés41Date d'inscriptiondimanche 17 novembre 2002StatutMembreDernière intervention14 avril 2004 4 févr. 2003 à 17:01
goldeneye: oué mais c pas multiplatteforme ... pke on peut dire aussi
exg %d0,%d1 en gnu asm m68k
trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 20032 2 févr. 2003 à 15:16
"le xor est une des opérations les plus rapides.
en asm "
J'irai voir chez intel car cela dépend de beaucoup de choses donc ne dit pas des trucs sans preuves.
"xor eax,eax "
Forcément on ne pas faire plus près que d'un registre au même registre. Mais ton code source C traduit en asm ne peut pas avoir ça. Alors ne dit pas des choses non fondées.
NiFF << "mais plutot de proposer une alternative interressante au niveau de la technique"
Je ne suis pas d'accord car c'est le genre de code compliqué peu abordable et qui nécessite obligatoirement un commentaire (chose rare chez beaucoup de programmeurs). C'est plutôt le genre de code a utilisé pour les concours du code source les plus illisible mais qui fonctionne (si si ça existe).
cs_NiFF
Messages postés92Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention24 juin 2004 1 févr. 2003 à 14:58
GoldenEye>En fait, la vocation de ce code n'était pas de fournir un méthode plus rapide, mais plutot de proposer une alternative interressante au niveau de la technique. On peut bien sur trouver plus rapide, mais l'optimisation de ce genre de code pour la vitesse n'a pas grand intérêt : il faudrait mesurer la vitesse mais ca doit être de l'odre du dix-millionième de seconde...
cs_GoldenEye
Messages postés527Date d'inscriptionvendredi 14 septembre 2001StatutMembreDernière intervention 6 octobre 20084 1 févr. 2003 à 13:24
Au profilage en mode release sur VC++ 6.0, le ratio du temps d"exécution total est 75%/25% en faveur de la méthode classique
Le code assembleur généré est le suivant
cs_vieuxLion
Messages postés455Date d'inscriptionsamedi 26 octobre 2002StatutMembreDernière intervention 6 avril 20048 1 févr. 2003 à 00:05
Ca pourrait servir dans un Quizz. C'est en tout cas intéressant
Je connaissais aussi, ça qui évite une déclaration
a+=b;//les deux (a+b) dans a
b=a-b;//retire b de (a+b) reste a
a=a-b;//retire a de (a+b) reste b
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 31 janv. 2003 à 22:45
Forcément que le 'xor eax, eax' est plus rapide que le 'mov eax, ebx', ca fait pas la même chose. Cela permet, en assembleur, d'optimiser les mises à zéro de registres en remplacant les 'mov eax, 0' par des 'xor eax, eax'.
cs_NiFF
Messages postés92Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention24 juin 2004 31 janv. 2003 à 22:35
trinitacs>le xor est une des opérations les plus rapides.
en asm : xor eax,eax est plus rapide que move eax,ebx
il faut voir ce que le compilateur génère en fait...
cs_NiFF
Messages postés92Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention24 juin 2004 31 janv. 2003 à 22:32
je ne savais pas pour login: ce code ne vient pas de là
cs_tavernier
Messages postés47Date d'inscriptionmardi 1 octobre 2002StatutMembreDernière intervention 3 juin 2003 31 janv. 2003 à 22:13
ca marche aussi pour les floats et les pointeurs. Il en est question dans la dernière page du LOGIN: qui vient d'arriver chez moi ce jour même.
trinitacs
Messages postés249Date d'inscriptionmardi 16 juillet 2002StatutMembreDernière intervention 7 août 20032 31 janv. 2003 à 19:26
Je n'avais jamais pensé à échangé des valeur ainsi avec des xor. En tout cas je trouve que ça fait bien porcos de tout mettre sur une ligne et je doute fortement que ce soit plus rapide que la méthode traditionelle.
22 mars 2010 à 09:46
5 ans de retard désormais !!!! :-P
Je vais me mettre au Cobol et poster une réponse dans 12 ans. Puis au fortran et poster dans 20 ans ?
Tu seras toujours la ? :-D
Sinon, j'ai eu un cas récent d'utilisation de la méthode XOR sur un PIC ou la mémoire ET les registres sont comptés sur LE doigt de la main.
Economiser un octet ou un registre peu parfois être très confortable. Sur un RISC, c'est aussi rapide qui plus est.
Lol, qui relèvera le défit de répondre once again :-) ?
9 oct. 2005 à 22:41
(t'as 2 ans et 3 mois de retard :P)
7 oct. 2005 à 14:54
// ca donne ça et ça marche pour tout !
// J'aime po les macros.
#include <string>
#include
using namespace std;
template <class T>
void SWAP(T &t1,T &t2)
{
T t=t1;
t1=t2;
t2=t;
}
void main()
{
int i=2,j=1;
SWAP(i,j);
cout << i << j << endl;
string s1(" après");
string s2("avant");
SWAP(s1,s2);
cout << s1 << s2 << endl;
}
8 juil. 2003 à 19:23
8 juil. 2003 à 12:40
Pour le bug avec 0, je ne sais plus trop où il était.
8 juil. 2003 à 04:06
http://graphics.stanford.edu/~seander/bithacks.html
soit ton site :) aller, sans rencune ;)
sinon je n'aime pas trop les gents qui ecrivent un algo comme des porc et qui ensuite disent : "ahh, regarder comme c'est degueulasse, c'est cool non ?"
#define SWAP(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
ceci est tres propre, et tres fonctionnel, de plus, je ne sais pas comment tu t'y es pris mais je n'ai pas le bug avec le zero dans une variable
trintacts, je pense quil est fort bien quil y ai peut de commentaire dans un code, justement, du commentaire dans un code ne contribue qu'a le salir d'avantage, un code bien ecrit ne necessite pas de commentaire, il parle de lui meme
de plus niff, ce contenter de ne pas gagner qqes microseconde est une bien grosse erreur car lorsque que tu fera ce genre d'operation des millions de fois par secondes, comptes le nombre de temps que tu pourrais gagner, meme un cycle d'horloge est toujours bon a gratter :)
golden-eye, te referer aux doc d'intel est vain, ce n'est pas en cherchant les cycle d'horloge des instructions asm que tu trouvera des reponses, il faut faire des tests sur le terrain
il a ete demontrer a maintes reprises que des instructions plus courtes que d'autre en temps cpu s'avairais plus longues car elle faisais appel a des fonctionnaliters plus lentes du sytemes, mais ca, je te laisse en discuter avec tes amis de ASM-France, ce genre de conversation n'as pas ca place ici, et je suis desoler d'en avoir mis
17 avril 2003 à 12:18
Si une des deux varaibles est à zéro, lorsque l'on fait a^=0 cela met les deux variables à zéro.
Sinon GoldenEye toi qui ramène ton code asm tu connais pas XCHG eax, ebx ?
4 févr. 2003 à 20:22
4 févr. 2003 à 17:01
exg %d0,%d1 en gnu asm m68k
2 févr. 2003 à 15:16
en asm "
J'irai voir chez intel car cela dépend de beaucoup de choses donc ne dit pas des trucs sans preuves.
"xor eax,eax "
Forcément on ne pas faire plus près que d'un registre au même registre. Mais ton code source C traduit en asm ne peut pas avoir ça. Alors ne dit pas des choses non fondées.
NiFF << "mais plutot de proposer une alternative interressante au niveau de la technique"
Je ne suis pas d'accord car c'est le genre de code compliqué peu abordable et qui nécessite obligatoirement un commentaire (chose rare chez beaucoup de programmeurs). C'est plutôt le genre de code a utilisé pour les concours du code source les plus illisible mais qui fonctionne (si si ça existe).
1 févr. 2003 à 14:58
1 févr. 2003 à 13:24
Le code assembleur généré est le suivant
Méthode XOR:
mov edx, DWORD PTR [ecx]
mov esi, DWORD PTR [eax]
xor esi, edx
mov DWORD PTR [eax], esi
mov edx, esi
mov esi, DWORD PTR [ecx]
xor esi, edx
mov DWORD PTR [ecx], esi
mov edx, esi
mov esi, DWORD PTR [eax]
xor esi, edx
mov DWORD PTR [eax], esi
Méthode classique :
mov esi, DWORD PTR [ecx]
mov eax, DWORD PTR [edx]
mov DWORD PTR [edx], esi
mov DWORD PTR [ecx], eax
ça se passe de commentaires.
1 févr. 2003 à 00:05
Je connaissais aussi, ça qui évite une déclaration
a+=b;//les deux (a+b) dans a
b=a-b;//retire b de (a+b) reste a
a=a-b;//retire a de (a+b) reste b
31 janv. 2003 à 22:45
31 janv. 2003 à 22:35
en asm : xor eax,eax est plus rapide que move eax,ebx
il faut voir ce que le compilateur génère en fait...
31 janv. 2003 à 22:32
31 janv. 2003 à 22:13
31 janv. 2003 à 19:26