LE SWAP LE PLUS CRADE DE L'HISTOIRE DU C++

trinitacs Messages postés 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 - 31 janv. 2003 à 19:26
hsaturn Messages postés 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/10352-le-swap-le-plus-crade-de-l-histoire-du-c

hsaturn Messages postés 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Derniè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és 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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és 14 Date d'inscription jeudi 6 octobre 2005 Statut Membre Derniè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.

#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;
}
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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és 92 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 24 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és 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
8 juil. 2003 à 04:06
interessant niff, mais tu aurais pu citer a source, a moins que
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
cs_NiFF Messages postés 92 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 24 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és 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
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és 41 Date d'inscription dimanche 17 novembre 2002 Statut Membre Dernière intervention 14 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és 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 2
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és 92 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 24 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és 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
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

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.
cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 8
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és 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
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és 92 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 24 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és 92 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 24 juin 2004
31 janv. 2003 à 22:32
je ne savais pas pour login: ce code ne vient pas de là
cs_tavernier Messages postés 47 Date d'inscription mardi 1 octobre 2002 Statut Membre Derniè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és 249 Date d'inscription mardi 16 juillet 2002 Statut Membre Dernière intervention 7 août 2003 2
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.
Rejoignez-nous