Annonce

Réduire
Aucune annonce.

La minute de Mr Cyclopède

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • La minute de Mr Cyclopède

    Donc faisant suite à ce qui était dit ici, nous allons examiner le code suivant :

    Code:
    // reverse byte-order for least/most signifigant-byte-first,
    // which is done differently on Mac and IBM...
    // This works as long as both platforms are IEEE, and
    // the values passed in are FOUR BYTES (32 bits)... this
    // includes FLOATS and LONGS, NOT SHORTS OR DOUBLEsS
    
    void rev_byte_order4(char* retval)
    {
    	char* add = retval;
    	char b1 = *(add);
    	add++;
    	char b2 = *(add);
    	add++;
    	char b3 = *(add);
    	add++;
    	char b4 = *(add);
    
    	add = retval;
    	*add = b4;
    	add++;
    	*add = b3;
    	add++;
    	*add = b2;
    	add++;
    	*add = b1;
    }
    
    void bswapi(int *pint)
    {
    	char tmpb[4];
    
    	memcpy(tmpb, pint, 4);
    	rev_byte_order4(tmpb);
    	memcpy(pint, tmpb, 4);
    }
    
    void bswapf(float *pf)
    {
    	char tmpb[4];
    
    	memcpy(tmpb, pf, 4);
    	rev_byte_order4(tmpb);
    	memcpy(pf, tmpb, 4);
    }
    Je vais détailler pour les non-programmeurs, les autres auront sûrement déjà compris les grandes lignes en regardant le code.

    Comme l'indique les commentaires le but est d'inverser l'ordre d'un groupe de quatre octets. Le premier devient le dernier, le deuxième l'avant dernier, etc... Le fait que ce soit pour des groupes de quatre octets est d'ailleurs mentionné en majuscules pour ne pas le louper.

    Nous voyons donc la fonction qui fait l'inversion : rev_byte_order4, et deux autres qui l'utilisent. L'une nommée bswapi pour BytesSWAPInteger, l'autre bswapf pour BytesSWAPFloat.

    Un œil averti vois déjà une source potentielle de problème avec bswapi : cette fonction prend en entrée un pointeur vers un int (c'est à dire un numéro de case mémoire qui nous indique où est le début du nombre entier dont on veut inverser les octets). Le hic est qu'un entier ( int ) n'est pas garanti comme faisant quatre octets de long, cela dépend de la machine pour laquelle le code aura été compilé. Dans le cas des MAC et PC ça sera ok mais ce n'est pas une bonne habitude que de ne pas contrôler la taille de ses variables, c'est la porte ouverte à des problèmes pas forcément simple à dépister.

    La suite est également peu banale :
    1 - bswapi crée un tableau local (local = qui n'existe que localement soit dans bswapi dans ce cas.) nommé tmpb et d'une taille de quatre octets ( char tmpb[4]; ).
    2 - Dans ce tableau sont ensuite copiés les quatre octets formant l'entier que l'on souhaite inverser ( memcpy(tmpb, pint, 4); ).
    3 - Le contenu de ce tableau est passé à rev_byte_order4 pour être inversé ( rev_byte_order4(tmpb); ).
    4 - Le contenu du tableau, maintenant inversé, est copié dans notre entier d'origine ( memcpy(pint, tmpb, 4); ).

    Ce n'est pas que ça ne fonctionne pas, c'est que c'est une sacré machine de Rube Goldberg pour simplement inverser quatre octets.

    Récapitulons :

    Ce que l'on veut faire :
    1 - Recevoir un entier à inverser.
    2 - L'inverser.

    Ce que l'on a fait, cas favorable où l'appel de la fonction memcpy est optimisé par le compilateur et donc supprimé :
    1 - On crée un tableau de quatre octets.
    2 - L'entier à inverser est copiée dans ce tableau.
    3 - L'entier dans le tableau est inversé.
    4 - L'entier inversé dans le tableau est copié dans l'entier d'origine.

    Ce que l'on a fait, cas défavorable où l'appel de la fonction memcpy n'est pas supprimé :
    1 - On crée un tableau de quatre octets.
    2 - On appelle memcpy pour copier l'entier à inverser dans ce tableau.
    3 - memcpy copie ce qu'on lui dit de copier.
    4 - L'entier dans le tableau est inversé.
    5 - On appelle memcpy pour copier l'entier inversé du tableau vers l'entier d'origine.
    6 - memcpy copie ce qu'on lui dit de copier.

    Il est facile de se rendre compte que bswapf fait exactement la même chose, la seule différence étant qu'elle inverse un flottant au lieu d'un entier.

    Les questions que tout cela soulève :
    1 - Pourquoi aller copier pour inverser la copie et ensuite recopier la copie inversée à l'endroit même ou se trouve ce que l'on voulait inverser en premier lieu ?
    2 - Pourquoi ne pas directement inverser ce foutu put..n d'entier directement là où il se trouve puisque c'est là qu'on veut mettre le résultat ?
    3 - En supposant qu'il y ai une utilité à faire ces copies, pourquoi aller risquer qu'un memcpy soit appelé pour QUATRE octets alors qu'il est extrêmement facile de copier QUATRE octets par d'autres moyens qui prennnent beaucoup moins de temps qu'un appel à memcpy ? Un memcpy pour 1024 octets je veux bien, mais QUATRE ? Comme on dit en anglais : WTF

    Cela vous semble un cas extrême ? Vous n'avez pas idée de ce que j'ai pu trouver dans tout le code que j'ai vu . Je laisse l'examen de rev_byte_order4 pour demain.

    PhM
    X-Plane 9.70 & 11.5r1 / W10 / AMD Ryzen 7 2700 / 8Go RAM / Sapphire R9 390 Nitro 8Go / Sapphire HD7870 GHz 2Go / Samsung LN40C530 / Oculus DK2 / LeapMotion / Saitek X56 / Thrustmaster Pendular Rudder

  • #1
    Re: La minute de Mr Cyclopède

    Ok, donc, c'est bien ça, effectivement, bien sûr, évidemment, avec plaisir, mais vous reprendrez bien du thé, avec plaisir mais sans verre pilé s'il vous plaît, bien sûr madame.

    :D plus sérieusement, je vais relire ça deux ou trois fois avant de tout piger je crois, mais merci PhM, c'est là une explication détaillée qui va m'apprendre plein de trucs on dirait ;)
    ---------------------------------
    MacBook Pro Retina 15" Core i7 2.5GHz 16GB RAM / Intel Iris Pro 1536MB VRAM / OS X 10.10(latest) / X-plane 10
    MacPro 27" 2.7GHz/12c 64GB RAM / 2xAMD D700 6GB / Mac OS X 10.9(latest) / X-Plane 10
    iMac 27" 3.2GHz i7 32Gb RAM / NVIDIA GeForce GTX 680MX 2GB GDDR5 / Mac OS X 10.9(latest) / X-Plane 10
    iMac 27" 2.9GHz i5 8Gb RAM / NVIDIA GeForce GTX 675MX 1GB GDDR5 / Mac OS X 10.9(latest) / X-Plane 10
    ---------------------------------

    Commentaire


    • #1
      Re: La minute de Mr Cyclopède

      Hello !

      8) Et bien moi je plussoie notre ami PhM ainsi que la solution qu'il propose pour rev_byte_order4 chez X-Pilot.com.

      Ce serait vraiment bien que d'autres regards et reviewers examinent le code de X-Plane. Mais il faudrait que ce soient des gens comme PhM qui entrent chez Laminar Research pour ça. Ce qu'il est possible de faire sur des projets open-source comme FlightGear, n'est pas possible avec X-Plane.

      En tous cas je suis convaincu que le manque d'initialisations à la création ou avant le chargement de structures de données (sujet ici), a causé un nombre important d'arrachages de cheveux chez des créateurs d'avions.

      Bons vols.
      OpenStreetMap - Ubuntu GNU/Linux -

      Commentaire


      • #1
        Re: La minute de Mr Cyclopède

        BEn à mon avis c'est bien là le souci: Aussi excellente que puisse être la solution de PhM, il est fort probable (encore une fois j'y connais rien et j'émets là une simple hypothèse) que cette optimisation force Austin à recoder un paquet d'autres choses... et ça à mon avis, et étant donné l'attention portée aux versions "mobiles" d'X-Plane et à d'autres développements annexes, c'est pas demain la veille que ça arrivera.
        Enfin, ça coûte rien ( à part peut-être une réponse mal-aimable du principal intéressé) de soumettre cette proposition de modification à Austin.
        ---------------------------------
        MacBook Pro Retina 15" Core i7 2.5GHz 16GB RAM / Intel Iris Pro 1536MB VRAM / OS X 10.10(latest) / X-plane 10
        MacPro 27" 2.7GHz/12c 64GB RAM / 2xAMD D700 6GB / Mac OS X 10.9(latest) / X-Plane 10
        iMac 27" 3.2GHz i7 32Gb RAM / NVIDIA GeForce GTX 680MX 2GB GDDR5 / Mac OS X 10.9(latest) / X-Plane 10
        iMac 27" 2.9GHz i5 8Gb RAM / NVIDIA GeForce GTX 675MX 1GB GDDR5 / Mac OS X 10.9(latest) / X-Plane 10
        ---------------------------------

        Commentaire


        • #1
          Re: La minute de Mr Cyclopède

          Merci PhM ! J'ai tout compris !=> l'important est d'arriver "entier" :D
          (Oui, bon, bin, chacun son niveau, hein ? Au moins, je m'intéresse moi, pfff :roll: )

          Bertrand

          ps: Austin et Ben avaient déjà fait un "nettoyage" du code pour la version 8 qui avait permis d'améliorer les performances... mais il est certain qu'ils ont dû faire seulement le plus gros.
          Win10 64b / IntelXeon 3.7 GHZ / 8 Go ram / NVIDIA Quadro K2000 2Go
          XPFR

          Commentaire


          • #1
            Re: La minute de Mr Cyclopède

            Certes, l'exemple que tu as pris, PhM, est assez... surprenant, mais il a (peut-être) sa (bonne) raison d'être !

            Il faut parfois s'asseoir sur ses prouesses de programmeur pour faire du code banal à en crever mais qui marche à tous les coups. X-Plane tourne sur trois systèmes d'exploitation et une tripotée de processeurs différents.

            Il vaut parfois mieux assurer ses arrières en faisant quelques lignes de trop.

            Il y a aussi un autre aspect, courant chez tous les programmeurs, quelque soit le langage utilisé et/ou ses compétences : on a une bibliothèque de routines que l'on se trimballe au fil des ans et que l'on utilise ici ou là, sans trop se préoccuper de savoir si, avec un langage qui évolue au fil des versions, telle ou telle routine vaut encore la peine d'être conservée dans notre fameuse boîte à malice !...

            On sait que sa petite usine à gaz (=Rube Goldberg en version française) marche (et ça, c'est de l'or en barre) et pour ce qu'elle a faire, on ne va pas se pencher à nouveau sur son code juste histoire de gagner quelles "tics" d'horloge d'autant plus que celle-ci cadence maintenant en MHz alors qu'à l'époque où l'on a pondu la routine, on parlait de KHz !...

            Ceci n'enlève rien à la démonstration de PhM qui a - bien évidemment - raison. C'est juste pour adoucir un peu les coups de fouet que mérite Laminar (quoique, ils aiment peut-être !)... :D

            Commentaire


            • #1
              Re: La minute de Mr Cyclopède

              effectivement, ils prêtent un peu le flanc quand même :D
              Mais Joloize à raison, le machin doit tourner sur plusieurs plateformes et il y a bien d'autres paramètres qui peut-être limitent les possibilités.
              Reste que les optimisations à la PhM seraient tellement bienvenues et qu'il serait peut-être bon pour Austin de penser à embaucher de l'aide - après tout Laminar doit quand même pouvoir se permettre ça entre temps (par opposition à l'époquer d'XP 5/6/7, où notre simu était encore un peu marginal comparé à FS)
              ---------------------------------
              MacBook Pro Retina 15" Core i7 2.5GHz 16GB RAM / Intel Iris Pro 1536MB VRAM / OS X 10.10(latest) / X-plane 10
              MacPro 27" 2.7GHz/12c 64GB RAM / 2xAMD D700 6GB / Mac OS X 10.9(latest) / X-Plane 10
              iMac 27" 3.2GHz i7 32Gb RAM / NVIDIA GeForce GTX 680MX 2GB GDDR5 / Mac OS X 10.9(latest) / X-Plane 10
              iMac 27" 2.9GHz i5 8Gb RAM / NVIDIA GeForce GTX 675MX 1GB GDDR5 / Mac OS X 10.9(latest) / X-Plane 10
              ---------------------------------

              Commentaire


              • #1
                Re: La minute de Mr Cyclopède

                A un détail près : on ne peut pas "nettoyer" un code.

                Si une routine utilisée 250000 fois par minute est mal foutue, on peut la réécrire complètement mais c'est un cas particulier. Corriger un code qui fait des centaines de milliers de lignes, c'est inenvisageable, on a plus vite fait de reprendre tout le bouzin à 0. Chose que personne ne fera jamais : on a plus vite fait d'attendre que le matos évolue et absorbe la perte de perf que de tout reprendre en se basant sur les perfs actuelles du matos visée. Autrement dit, la bonne logique commerciale, c'est qu'il est urgent de ne rien faire, la reprise du code de v8 à v9, dixit Austin à ce sujet to myself, ayant déjà été une horreur à gèrer.
                Quand tous les faignants du monde donneront la main à tous les abrutis, je vous prédis que ça va faire une sacré farandole... Espérons seulement que je ne sois pas de la danse.

                Commentaire


                • #1
                  Re: La minute de Mr Cyclopède

                  j espère que ce n'est pas pour le little big indien....

                  Cela ert en hardware (liaison bit inverser ou packet ex power pc et PC, miaison série, etc...)

                  Au vu du code il faut faire plus lisible et plus court
                  IVAO/VATSIMF-HFCE
                  mac OS 10.6.8+ Cybord 3D ch throttle 4 quadrant /mac OS 10.6.8/TS (plantronics DSP 500) /Xplane v9.70 + palonnier CH + TrackiR 5 + TrackPRO

                  Commentaire


                  • #1
                    Re: La minute de Mr Cyclopède

                    Envoyé par joloize
                    ... mais il a (peut-être) sa (bonne) raison d'être !
                    J'en doute très sérieusement, mais j'écouterais bien volontiers toute démonstration visant à prouver l'utilité ce qui est décrié dans cet exemple.

                    Envoyé par joloize
                    Il faut parfois s'assoir sur ses prouesses de programmeur pour faire du code banal à en crever mais qui marche à tous les coups. X-Plane tourne sur trois systèmes d'exploitation et une tripotée de processeurs différents.
                    Le problème étant que ce n'est pas du code banal, et que la façon dont ça a été fait n'a aucun lien avec le fait de tourner sous différents OS avec différents processeurs. Je vais donner la version banale de cet exemple dans mon prochain post, la différence sera facile à voir.

                    Envoyé par joloize
                    Il y a aussi un autre aspect, courant chez tous les programmeurs, quelque soit le langage utilisé et/ou ses compétences : on a une bibliothèque de routines que l'on se trimballe au fil des ans et que l'on utilise ici ou là, sans trop se préoccuper de savoir si, avec un langage qui évolue au fil des versions, telle ou telle routine vaut encore la peine d'être conservée dans notre fameuse boite à malice !...
                    Tout à fait, que ce soit du vieux code ok, mais ce qui est important dans cet exemple c'est que cela a été fait en dépit du bon sens dès le début. Je n'arrive même pas à comprendre comment on peut avoir l'idée d'écrire ça comme ça.

                    Envoyé par joloize
                    On sait que sa petite usine à gaz (=Rube Goldberg en version française) marche (et ça, c'est de l'or en barre) et pour ce qu'elle a faire, on ne va pas se pencher à nouveau sur son code juste histoire de gagner quelles "tics" d'horloge d'autant plus que celle-ci cadence maintenant en MHz alors qu'à l'époque où l'on a pondu la routine, on parlait de KHz !...
                    Malheureusement cette vision disant que l'on peut gaspiller tant on a de resources n'est pas réaliste. Les horloges des processeurs sont maintenant dans les GHz, et les mémoires n'arrivent plus à suivre. Et ce ne sont pas quelques cycles qui sont perdus lorsque l'on ne fait pas un minimum attention, mais des centaines, ou des milliers. J'ai vécu encore récemment une telle situation avec un moteur de jeu qui n'était pas capable de faire tourner un jeu en 2D à 30 fps, un jeu tout con, pas de 3D, pas de choses compliquées, on tombait à 10 ou 15 fps lorsqu'on affichait un texte un peu long.

                    Et, en prenant X-Plane pour exemple, imaginons que la somme des gaspillages puisse nous donner des fps identiques pour des scènes, ou des avions, un peu plus lourds graphiquement, qui n'en voudrait pas ? Levez la main ceux qui n'en veulent pas ?

                    PhM
                    X-Plane 9.70 & 11.5r1 / W10 / AMD Ryzen 7 2700 / 8Go RAM / Sapphire R9 390 Nitro 8Go / Sapphire HD7870 GHz 2Go / Samsung LN40C530 / Oculus DK2 / LeapMotion / Saitek X56 / Thrustmaster Pendular Rudder

                    Commentaire


                    • #1
                      Re: La minute de Mr Cyclopède

                      Envoyé par maclinuxg4
                      j espère que ce n'est pas pour le little big indien....
                      Tes espoirs vont être déçus, c'est pour convertir entre little et big endian.

                      Envoyé par maclinuxg4
                      Au vu du code il faut faire plus lisible et plus court
                      Pour le moins.

                      PhM
                      X-Plane 9.70 & 11.5r1 / W10 / AMD Ryzen 7 2700 / 8Go RAM / Sapphire R9 390 Nitro 8Go / Sapphire HD7870 GHz 2Go / Samsung LN40C530 / Oculus DK2 / LeapMotion / Saitek X56 / Thrustmaster Pendular Rudder

                      Commentaire


                      • #1
                        Re: La minute de Mr Cyclopède

                        En fait pour ce qui est de rev_byte_order4 tout est dit sur le site X-Pilot. Je vais juste vous faire part d'une perle trouvée dans du code actuel, pas du vieux code, pas une vieille lib, un truc fait récemment.

                        Donc la finalité de bswapi et bswapf, qui utilisent rev_byte_order4, est d'inverser quatre octets. Ces fonctions étaient destinées à être utilisées pour l'envoi et la réception de paquets UDP, où les valeurs doivent être écrite en big-endian bien que les processeurs des PC et MAC soient little-endian.

                        Si je prends un exemple avec des lettres au lieu de chiffres, si un processeur big-endian écrivait "xplane" en mémoire il commencerait par écrire le x, puis le p, puis le l, etc.... Un processeur little-endian commencerait par écrire le e, puis le n, puis le a, etc... On voit bien que si l'un lit ce que l'autre a écrit il n'y comprend rien, d'où la nécessité d'inverser tout ça. On voit également que si notre mot ne comporte qu'une lettre il n'y a rien à inverser, on lit la lettre et c'est fini.

                        Et bien pour certains ce n'est pas le cas, un collègue a trouvé un bout de code qui consciencieusement passe en revue tous les octets d'un tableau, se pose à chaque fois la question de savoir s'il est dans le mode où il faut les inverser (bien que ce mode ne change pas), et écrit consciencieusement l'octet "inversé" par des opérations qui, au final, ré-écrivent le même octet qui a été lu (ben oui y'en a qu'un y'a pas moyen de l'inverser). Et ce n'est pas une blague, c'est du vécu. La aussi je ne comprends absolument pas comment on peut écrire un truc pareil, ça me dépasse. Ecrire un truc inutile qui va se poser des milliers de fois une question inutile et accomplir un travail inutile. Quel cheminement intellectuel peu conduire à ça, où est le bug mental ?

                        PhM
                        X-Plane 9.70 & 11.5r1 / W10 / AMD Ryzen 7 2700 / 8Go RAM / Sapphire R9 390 Nitro 8Go / Sapphire HD7870 GHz 2Go / Samsung LN40C530 / Oculus DK2 / LeapMotion / Saitek X56 / Thrustmaster Pendular Rudder

                        Commentaire


                        • #1
                          Re: La minute de Mr Cyclopède

                          Alors un chti nexemple pour expliquer pourquoi des fois on peu ce retrouver avec des truc a s'arracher les cheveux...
                          imaginons un gars qui développe ses pages php pour accéder à une base de données.
                          Jusque là rien d'extraordinaire, il fait moult fonctions qui vont toutes accéder à la base, et comme il est malin, il créer une fonction pour exécuter les requêtes.
                          Sauf qu'un jour ce gars met son code en exploitation mais les règle de sécurité sur la base n'est pas tout à fait la même...
                          Et d'un code qui semblait plutôt optimiser, on ce retrouve avec un truc qui ne fonctionne plus du tout. Impossible de toucher à la sécurité de la base en exploitation
                          Il faut donc soit tout réécrire, soit insérer des bout de code pour ce connecter et déconnecter plusieurs fois par fonction

                          On est donc passer d'un code optimisé sur sa station de développement à un code qui répète sans cesse les même opérations en exploitation.....
                          Comment somme nous passer de l'un à l'autre?
                          et pourquoi faire des truc aussi débile des fois?
                          et bien des fois, c'est tout simplement par ce que la roue n'existait pas.... depuis il y à même des roulements à billes, mais quand les plans ont été tracées, il à bien fallut l'inventer :p
                          et quand c'est bien tordu, reste à retrouver que ces cubes, forment les élément de la roue, surtout si c'est vieux (ah! quand j'étais jeune, je ne commentais pas mes codes..).

                          andertal

                          Qui ne fait ni l'apologie des uns, ni des autres...

                          Commentaire


                          • #1
                            Re: La minute de Mr Cyclopède

                            ah! quand j'étais jeune, je ne commentais pas mes codes..).
                            ah bon faut commenter?
                            Quand tous les faignants du monde donneront la main à tous les abrutis, je vous prédis que ça va faire une sacré farandole... Espérons seulement que je ne sois pas de la danse.

                            Commentaire


                            • #1
                              Re: La minute de Mr Cyclopède

                              Envoyé par PhM
                              Envoyé par maclinuxg4
                              j espère que ce n'est pas pour le little big indien....
                              Tes espoirs vont être déçus, c'est pour convertir entre little et big endian.

                              Envoyé par maclinuxg4
                              Au vu du code il faut faire plus lisible et plus court
                              Pour le moins.

                              PhM
                              Ben au moins j avais bien compris le bout de code.

                              :D :D
                              IVAO/VATSIMF-HFCE
                              mac OS 10.6.8+ Cybord 3D ch throttle 4 quadrant /mac OS 10.6.8/TS (plantronics DSP 500) /Xplane v9.70 + palonnier CH + TrackiR 5 + TrackPRO

                              Commentaire

                              Chargement...
                              X