IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez C++ Discussion :

De la rapidité du code [Trucs & Astuces]


Sujet :

Contribuez C++

  1. #61
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Blustuff
    Une multiplication cachée dans Tab[i] ?????
    Qu'est ce que le compilateur a optimisé auquel on aurait pas pensé ? (Moi mon compilateur il optimise juste un seul truc, alors on va pas loin...)
    Je ne sais pas si tu as remarque mais on passe d'une expression
    avec 4 multiplications (dont une cachee) a deux multiplications (dont une cachée). De plus il a effacé l'addition inutile (que ce soit des constantes ou non le resultat est le meme) plus un petit rearrangement des operations surement pour etre plus efficace. L'optimiseur optimise donc mais pas encore suffisamment.

    On gagne que dalle en déroulant la boucle. Les prediction on un taux de réussité très proche de 100 % quelque soit la methode ded prédiction, et le gain toutefois obtenu par le déroulement, est ridicule par rapport au coup de l'accès en mémoire. Si MAX est grand on va avoir 1 cache miss toutes les 8 iteration, ou développé, 4 miss pour 1 ittération, non ?
    Ce n'est pas parce que la prediction est bonne que
    la comparaison et le saut ne coutent plus rien.
    Ce n'est pas le seul gain mais tout mis bout a bout
    on y gagne.
    C'est un tout: moins d'instructions par elements,
    des instructions simplissimes (trois additions, une ecriture en memoire).

    Je crois que le seul gain interessant est la suppression des multiplication; parce que je me suiis trompé, il y en a 2 seulement en parrallèe la dernière devant attendre un resultat, c'est ce qui doit donner le gain de 20% chez moi.
    Perso je me fiche des operations que le cpu fait en parallele
    c'est au compilateur de trouver la bonne combinaison
    une fois que j'ai fait l'elagage preliminaire pour lui
    (reduction logique plus quelques astuces).

    Donc je le repete: entre la version "naive" optimisee par le compilateur et la version optimisee a la main et deroulee partiellement
    j'arrive a diviser le temps d'execution par trois ce qui ne me parait pas si etonnant que ca vu la tete des lignes de code et du code generé.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  2. #62
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Citation Envoyé par LeGreg
    Je ne sais pas si tu as remarque mais on passe d'une expression
    avec 4 multiplications (dont une cachee) a deux multiplications (dont une cachée).
    Les multiplications ne sont pas un problème si le processeur a quelque chose a fiare en attendant. Mais dans la version initiale une multiplication ne peut se faire en parallèle donc c'est là le problème. Ou est la multiplica&tion cachée ??

    Citation Envoyé par LeGreg
    Ce n'est pas le seul gain mais tout mis bout a bout
    on y gagne.
    Mes mesures semblent dire le contrraire. J'ai testé ta version, je ne sait pas si c'est mon compilateur qui compile mal (Borland C++ 5) mais il n'y a aucune différence entre ta version et la mienne. Il y a une légère préference entre celles-ci et la version déroulée (2 % de gain)

    Citation Envoyé par LeGreg
    C'est un tout: moins d'instructions par elements,
    des instructions simplissimes (trois additions, une ecriture en memoire).
    L'accès est bien plus long que toutes les autres instrtuctions réunies.

    Citation Envoyé par LeGreg
    j'arrive a diviser le temps d'execution par trois ce qui ne me parait pas si etonnant que ca vu la tete des lignes de code et du code generé.
    Ca dépend. Tu as mis combien à Max ? si tu as mis un truc < 1000, oui, ca n'est pas etonnant. Mais dans ce cas le temps d'execution est trop court pour etre mesuré. Si tu as répété la foncrtion plusieurs fois, les données sont encore dans la cache donc les accès en mémoire sont plus courts. Dans ce cas, oui, effectivement tu as raison, et je suis tout a fait d'accord.

  3. #63
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Ca dépend. Tu as mis combien à Max ? si tu as mis un truc < 1000, oui, ca n'est pas etonnant. Mais dans ce cas le temps d'execution est trop court pour etre mesuré. Si tu as répété la foncrtion plusieurs fois, les données sont encore dans la cache donc les accès en mémoire sont plus courts. Dans ce cas, oui, effectivement tu as raison, et je suis tout a fait d'accord.
    Tu parles de cache est c'est peut-etre ce qui nous differencie:
    tu consideres qu'un gain n'est pas interessant s'il ne peut beneficier de l'acces rapide au cache.

    Effectivement si l'acces a la memoire est prohibitif, dans ce cas
    on n'y gagne rien..

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #64
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Les multiplications ne sont pas un problème si le processeur a quelque chose a fiare en attendant. Mais dans la version initiale une multiplication ne peut se faire en parallèle donc c'est là le problème. Ou est la multiplica&tion cachée ??
    lorsque tu fais tab[i], le processeur
    doit multiplier i par la taille d'un int pour acceder
    a l'element. Evidemment il est libre d'optimiser pour supprimer
    cette multiplication.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #65
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Non pas quand la taille de l'element est 1, 2, 4, ou 8. (Ce qui est le cas de tous les élements de taille < 9 quand l'alignemet est 4 ou +) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Tableau[133]; 
     
    main()
    {
      int a;
      Tableau[a] = 3
    }
    a pour traduction en asm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      mov eax, a
      mov Tableau[eax*4], 3
    la * 4 s'appelle le scale, est peut etre 2, 4, ou 8. Dans ce cas, il n'y a aucune multiplication. Le temps de calcul est compris dans le décodage de l'adresse.

    Mais j'ai fait d'autres erreurs. Je fait quelques tests un peu serieux pour une fois, et je reviens

  6. #66
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Blustuff
    la * 4 s'appelle le scale, est peut etre 2, 4, ou 8. Dans ce cas, il n'y a aucune multiplication. Le temps de calcul est compris dans le décodage de l'adresse.
    oui je ne connaissais pas le scale,
    evidemment je comprendrai ca dans la case "optimisation specifique"
    puisque si je remplace mon int par un type perso qui ne fait pas une puissance de deux octets ca ne marchera plus.
    Mais c'est bien de le faire remarquer

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #67
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    désolé pour deux trois betises que j'ai dites avant et pour celles que je vais peut etre dire maintenant. Voici le resultat des tests : (désolé aussi pour la longueur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //Fonction Initiale :
     
    void Fonction1()
    {
      for (int i=0; i<MAX; i++)
      {
        tab[i] = a * i * i + b * i + c + d;
      }
    }
     
    /*
    @5:
    	mov       ecx,dword ptr [_a]
    	mov       ebx,dword ptr [_b]
    	imul      ecx,eax               ; a * i
    	imul      ecx,eax               ; a * i * i
    	imul      ebx,eax               ; b * i
    	add       ecx,ebx               ; a * i * i + b * i
    	add       ecx,dword ptr [_c]    ; a * i * i + b * i + c
    	add       ecx,dword ptr [_d]    ; a * i * i + b * i + c + d
    	mov       dword ptr [edx],ecx   ; tab[i] = a * i * i + b * i + c + d;
    @7:
    	inc       eax                   ; i++
    	add       edx,4                 ; edx = &tab[i] + 4
    	cmp       eax,10000             ; Si i < MAX
    	jl        short @5              ; alors Nouvelle Ittération
     
    La seule optimisation est une utilisation de varaible pour stocker l'adresse de
    tab[i]. En revanche ici, aucune multiplication, puisque l'optimisation entraine
    a ajouter 4 et non recalculer l'adresse a chaque fois.
     
    Je ne vois pas pouquoi mon compilateur remet a et b a chaque fois dans ecx et
    ebx. C'est parfaitement inutile. Serait-il sot ?
    */
     
     
    //Forme Recursive. Gain : ~50 % :
     
    void Fonction2()
    {
      tab[0] = c + d;
      int x = b - a - c - d;
      int y = 0;
      int a2 = 2 * a;
     
      for (int i = 1 ; i < MAX ; i++)
      {
        y += a2;
        tab[i] = tab[i-1] + y + x;
      }
    }
     
    /*
    @12:
    	add       edx,esi
    	mov       edi,dword ptr [eax]
    	add       edi,edx
    	add       edi,ebx
    	mov       dword ptr [eax+4],edi
    @14:
    	inc       ecx
    	add       eax,4
    	cmp       ecx,10000
    	jl        short @12
    */
     
     
    //Suppression des calculs inutiles. Gain ~25 % :
     
    void Fonction3()
    {
      tab[0] = c + d;
      int x = b - a - c - d;
      int y = a * 2;
     
      for (int i = 1 ; i < MAX ; i++)
      {
        x += y;
        tab[i] = tab[i-1] + x;
      }
    }
     
    /*
    @19:
    	add       edx,ebx
    	mov       esi,dword ptr [eax]
    	add       esi,edx
    	mov       dword ptr [eax+4],esi
    @21:
    	inc       ecx
    	add       eax,4
    	cmp       ecx,10000
    	jl        short @19
    */
     
     
    //Utilisation de pointeur dans la boucle. Gain ridicule :
     
    void Fonction4()
    {
      tab[0] = c + d;
      int x = b - a - c - d;
      int y = a * 2;
     
      /*
      Normalement tab + MAX est fixe a la compilation mais mon
      compilateur refuse d'effectuer le calcul. J'ai donc utilisé
      la variable q
      */
      for (int* p = tab, *q = tab + MAX ; p < q ; p++)
      {
        x += y;
        *p = p[-1] + x;
      }
    }
     
    /*
    Note : Ca sert juste a supprimer le inc ecx
     
    @26:
    	add       edx,ecx
    	mov       esi,dword ptr [eax-4]
    	add       esi,edx
    	mov       dword ptr [eax],esi
    @28:
    	add       eax,4
    	cmp       ebx,eax
    	ja        short @26
    */
     
     
    //Variable intermediaire. Gain : ~30 %
     
    void Fonction5()
    {
      tab[0] = c + d;
      int x = b - a - c - d;
      int y = a * 2;
     
      int z = tab[0];
     
      for (int* p = tab, *q = tab + MAX ; p < q ; p++)
      {
        x += y;
        z += x;
        *p = z;
      }
    }
     
    /*
    @33:
    	add       edx,ebx
    	add       ecx,edx
    	mov       dword ptr [eax],ecx
    @35:
    	add       eax,4
    	cmp       esi,eax
    	ja        short @33
    */

    Pour Max < 100, les perforamnces sont masquées par l'appel de fonction, et les tests sont difficile a faire (Mon compteur de Perf n'a qu'une frequence de 3 Mhz, donc difficile de tester précisement si Max < 100)

    Pour Max > 100, les performances vont en diminuant quand MAX augmente. On peut aller jusqu'a 5 fois plus rapide avec le déroulement de la boucle.

    Pour Max > 1000000, le gain n'excède pas 20 % et le déroulement fait même perdre des perofmances, ce que je ne comprends pas trop, le code tiens largement dans le cache theoriquement.

    Bon tout ca, n'est pas très precis, vu qu'il suffit que windows me pique la min pendant l'execution pour que les tests soient faussés, alors je fait ca sur une vingtaine d'execution, mais ca reste approximatif.

    Le seul truc qui me parait a peu près evident, c'est qu'il est difficile de savoir si un code est plus rapide sans le tester, et que le code issu de la compilation n'étant pas toujours prévisible (j'ai souvent des surprises quand même...) il vaut mieux avoir toujours le listing asm sous les yeux. Quoiqu'il en soit, c'est toujours plutot rare d'avoir à optimiser un code non ?

  8. #68
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Je vois qu'aucun de vous deux n'évoque l'optimisation qui consiste à utiliser l'opérateur ++ antéposé dans le for.
    Pourquoi cela ????
    Oups...
    -

  9. #69
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    houlà, a cette heure là il faut utiliser des mots simples... J'ai pas compris la question. Tu peux expliciter au moins pour moi qui ait du mal avec la seule langue qui ne me paraisse pas trop étrangère ?

  10. #70
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    ayé j'ai compris en lisant le post sur ++ (enfin je crois, tu me diras si c'est pas ca). Chager i++ en ++i (c'est ca ?) est inutile puisque i++ est tout seul. Effectivement; le c++ laisserait penser que operator++ pour les int a un code. Mais en fait, il n'en a pas, parce qu'il est directement traduit en assembleur par

    et qu'il suffit de modifier sa place pour que ce soit la copie de i qui soit utilisée dans le calcul :

    se voit traduis par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov eax, c
    add eax, i   ;i utilisé dans l'addition
    inc i        ;i incrementé après.
    mov a, eax
    quoiqu'il en soit, i++ etant tout seul, pas de copie

  11. #71
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    C'était bien ma question, en effet.
    Et la réponse est convaincante. Merci pour l'info !
    Oups...
    -

  12. #72
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 24
    Points : 31
    Points
    31
    Par défaut
    dans le meme domaine, jai une autre question :

    c quoi le plus rapide :
    (note, le but du code est d'empecher une div par 0)
    ou
    le compilateur vas t'il optimiser le "i = i;" inutile dans le cas ou i != 0 ?
    _____________
    (c) Maw-ware

  13. #73
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 60
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Argh!
    dans le meme domaine, jai une autre question :

    c quoi le plus rapide :
    (note, le but du code est d'empecher une div par 0)
    ou
    le compilateur vas t'il optimiser le "i = i;" inutile dans le cas ou i != 0 ?
    Apres avoir regarde l'assembleur, il est clair que VC++ n'optimise absolument pas la premiere solution.

    Premiere solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cmp         dword ptr [i],0
    jne         main+119h (00401679)
    mov         dword ptr [ebp-20h],1
    jmp         main+11Fh (0040167f)
    mov         ecx,dword ptr [i]
    mov         dword ptr [ebp-20h],ecx
    mov         edx,dword ptr [ebp-20h]
    mov         dword ptr [i],edx
    Deuxieme solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cmp         dword ptr [i],0
    jne         main+10Ah (0040166a)
    mov         dword ptr [i],1
    Etant donne que le i=i n'est pas optimise, ca veut dire que tu vas forcement dans un des deux branches, donc il y a automatiquement un saut, alors que dans le premier cas il n'y a de saut que si i!=0.

    De plus, dans le premier cas, le resultat est stocke dans une variable temporaire qui n'est affectee a i qu'a la fin.
    Si la connaissance peut créer des problemes, ce n'est pas par l'ignorance que l'on peut les résoudre.
    -- Isaac Asimov

  14. #74
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Edite du message suite à une grosse bourde ma part !
    Je m'excuse

    En gros je vais dire qu'il est mieux d'utiliser un memcpy ou memccpy pour copier des zones de mémoires qui ont le même type. Par exemple 2 gros char*.

    Encore désolé (décidément il faut vraiment que j'arrete de coder la nuit !).

  15. #75
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Yabo
    Résultats en sortie :
    Duree boucle 1 : 2890 ms
    Duree boucle 2 : 31 ms
    Oui mais en fait ce n'est pas tres etonnant
    etant donne que sscanf et memcpy ne font
    pas vraiment la meme chose..

    Je ne sais pas ou tu as ete pecher que
    tes deux boucles faisaient la meme chose !

    C'est un troll ou c'est serieux ?

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  16. #76
    Membre régulier

    Inscrit en
    Décembre 2002
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 60
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par Yabo
    Conclusion :
    Préférez toujours l'utilisation d'un memcpy() ou d'un memccpy au lieu de n'importe quelle autre fonction de duplication ou de conversion de variables.
    C'est absolument n'importe quoi la!!!!!!!!!!!!!!!!!!

    memcpy "peut"! remplacer certaines duplications (et encore, pas toutes), mais ne peut ABSOLUMENT PAS remplacer les fonctions de conversion.

    memcpy fait une copy bit a bit, or la representation binaire de 3.760000 en char* ou en float n'a RIEN a voir. Yabo, est-ce que tu as ne serait-ce qu'essaye d'afficher le resultat de ton float via "cout" apres avoir fait une telle copie pour voir ce que ca donne...

    Et meme dans le cas d'une duplication, ca ne fonctionne plus si l'objet duplique est une classe ou une structure qui contient des pointeurs. Car alors tu va copier l'adresse du pointeur et te retrouver avec deux objets qui pointent vers la meme zone!!! Et cela sans aucun moyen fiable de controle!

    Le seul cas ou le memcpy est vraiment applicable de facon securisee, c'est pour la copie de types de base ou de tableaux de types de base.
    Si la connaissance peut créer des problemes, ce n'est pas par l'ignorance que l'on peut les résoudre.
    -- Isaac Asimov

  17. #77
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Elrond
    memcpy fait une copy bit a bit, or la representation binaire de 3.760000 en char* ou en float n'a RIEN a voir. Yabo, est-ce que tu as ne serait-ce qu'essaye d'afficher le resultat de ton float via "cout" apres avoir fait une telle copie pour voir ce que ca donne...
    A mon avis c'est un troll ca peut pas etre aussi gros..

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  18. #78
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 62
    Points : 58
    Points
    58
    Par défaut
    Et le conseil le plus utile :

    Avant de programmer, ecrire l'algorithme en utilisant une analyse methodologique appropriee !

    Mais la on sort du forum C++...
    "Le plus simple est toujours le meilleur, mais le meilleur n'est pas toujours le plus simple"

  19. #79
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    J'ai quand même une petite remarque: en dehors de la recherche du meilleur algorithme et de remarques évidentes comme éviter l'écriture sur disque, etc., il est inutile de se creuser la tête puisque les meilleurs compilateurs font tout tout seul (inline, déroulage de boucles, optimisation des opérations, etc...).
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  20. #80
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par rolkA
    J'ai quand même une petite remarque: en dehors de la recherche du meilleur algorithme et de remarques évidentes comme éviter l'écriture sur disque, etc., il est inutile de se creuser la tête puisque les meilleurs compilateurs font tout tout seul (inline, déroulage de boucles, optimisation des opérations, etc...).
    malheureusement non un compilateur ne fait pas tout
    et un programme mal écrit restera lent meme avec un bon compilateur.

    Evidemment tous les programmes n'ont a priori pas besoin de cette rapidité, de ce coté la je suis bien d'accord.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2014, 17h52
  2. Optimiser rapidité code
    Par bobosh dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/08/2008, 16h12
  3. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  4. requete QBE / requete code : rapidité et index
    Par LostIN dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 05/07/2006, 08h54
  5. [rapidité du code] Mise a jour a partir d'un TQuery.
    Par goethe dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/10/2004, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo