GCC 5.0 prochainement disponible avec de nombreuses améliorations

GCC 5.0 prochainement disponible avec de nombreuses améliorations

Un « petit » bond de C89 vers C11

Avatar de l'auteur
Vincent Hermann

Publié dans

Logiciel

07/04/2015 3 minutes
51

GCC 5.0 prochainement disponible avec de nombreuses améliorations

GCC est un ensemble de compilateurs largement utilisé pour la création des logiciels open source. La version 5.0, qui sera publiée dans quelques semaines, proposera une vaste liste d’améliorations, dont la plus importante est très clairement l’utilisation par défaut de la norme C11, en lieu et place de la C89.

GCC passe de la norme C89 à C11

GCC (GNU Compiler Collection) 5.0 arrivera bientôt et les développeurs devront absorber une vraie vague de nouveautés. La plus importante concerne ceux qui codent en C puisque le compilateur utilisera par défaut GNU11 au lieu de GNU89. Il s’agit respectivement des implémentations des normes ISO C11 et C89, ce qui signifie une modernisation évidente dans le compilateur dans ses réglages par défaut. On remarquera d’ailleurs que GCC avait fait l’impasse sur la norme C99, sortie entre temps, comme norme de base pour la compilation.

Les normes C définissent le socle standard qu’un développeur peut attendre d’un compilateur en particulier. Par exemple, C11 a apporté la possibilité d’aligner les structures, le support des structures et des unions anonymes, a amélioré la gestion du multithreading et la gestion des chaines Unicode, etc. Bien entendu, rien n’empêchait les développeurs d’activer la norme C11, mais l’utilisation par défaut reste une étape cruciale.

Nombreux ajouts d'architectures et optimisations diverses

GCC 5.0 contiendra également de nombreuses améliorations. Par exemple, les optimisations interprocédurales (conçues pour améliorer les performances dans le code utilisant fréquemment les mêmes fonctions de petite et moyenne tailles) peuvent réaliser une nouvelle passe Identical Code Folding (ICF) permettant de regrouper les fonctions identiques. Diverses optimisations sont présentes, notamment sur les tables virtuelles, les variables en écriture seule ou encore quand les link-time optimizations (LTO) sont activées.

Côté support, cette version 5.0 de GCC ne sera pas en reste, avec notamment :

  • Les extensions AVX-512 dans les futurs processeurs Xeon de la génération Skylake
  • De nombreuses fonctionnalités de C++14
  • L’interface de programmation parallèle Cilk Plus d’Intel
  • OpenMP 4.0 (programme parallèle là encore) pour C, C++ et Fortran
  • Le langage Go (de Google) dans sa version 1.4.2
  • MIPS Release 3, 5 et 6
  • L’arrivée de la compilation du Just-In-Time (JIT) pour la bibliothèque libgccjit, même si cette dernière est toujours expérimentale.

Les développeurs intéressés pourront lire sur le site officiel de GCC la très longue liste des améliorations prévues. Nous mettrons évidemment à jour cette actualité pour signaler la disponibilité du compilateur. On notera également que la future version 22 de Fedora intègrera GCC 5.0 par défaut.

Écrit par Vincent Hermann

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

GCC passe de la norme C89 à C11

Nombreux ajouts d'architectures et optimisations diverses

Fermer

Commentaires (51)


Etant un grand utilisateur de MinGW, j’attends de voir si ce sera plus performant que la 4.7, parce que pour l’instant, autant au niveau taille de code que vitesse d’exécution, les 4.8 et 4.9 (surtout la 4.8 qui est une horreur sans nom) sont vraiment à la ramasse.

Dans tous mes projets, je suis bloqué sur la 4.7 pour ces raisons.


Plus qu’à attendre que tout le monde se mettent à jour…

…. et je crains que le processus dure encore plus longtemps que la disparition d’IE6.


> On remarquera d’ailleurs que GCC avait fait l’impasse sur la norme C99 sortie entre temps.



Dire que l’impasse a été faite sur c99 est un peu fort… Voir ici et pour les supports de c99 dans gcc (depuis la version 4.5).



Après, on es d’accord, par défaut, gcc ne compile pas du c99, il faut lui demander explicitement pour qu’il le fasse.


Ça tombe bien, on parle de norme par défaut pour la compilation. Mais j’ai insisté un peu plus sur ce point dans une petite modification.


Je me demandais si “ton” problème venait de GCC ou du couple GCC/Windows.


Qu’est-ce que Windows vient faire là-dedans ?

Je parle de performance pure, de code effectuant des calculs qui pourrait être porté sur Linux avec pratiquement aucune modification.

Quant aux appels système, c’est toujours le même système qui est en-dessous. Windows ne se décide pas à ralentir subitement s’il détecte que l’exécutable est issu d’une version de GCC qu’il n’aime pas.



Je ne suis d’ailleurs pas le seul à avoir constaté ça : https://bbs.archlinux.org/viewtopic.php?id=160566

Et là, c’est pas du Windows…



Pour moi c’est un fait : il n’y a aucune vérification des performances globales dans la pratique. Lorsque la 4.7 est sortie, je l’ai comparée aux compilos d’Intel et de MS : GCC 4.7 produit un code presque aussi rapide que le compilateur d’Intel de l’époque (et bien sûr, je l’ai testé sur plusieurs trucs).

Et je me souviens, avant d’avoir arrêté de coder pendant quelques années, qu’il y a une dizaine d’années, c’était pareil : les performances variaient vers le haut ou vers le bas d’une version à l’autre, et les différences étaient à chaque fois énormes, tout comme aujourd’hui.



Ca ne m’arrange pas parce que l’implémentation des intrinsics AVX de la 4.7 n’est pas complète. Et l’ASM n’est plus trop ma tasse de thé.








vampire7 a écrit :



Je parle de performance pure, de code effectuant des calculs qui pourrait être porté sur Linux avec pratiquement aucune modification.

[…]

Je ne suis d’ailleurs pas le seul à avoir constaté ça : https://bbs.archlinux.org/viewtopic.php?id=160566

Et là, c’est pas du Windows…





Merci pour ces précisions.



C’était par curiosité, j’utilise très peu GCC (mais CC sous UX)



Peut être pas assez présent dans la news, mais ca fait longtemps que C++11 était supporté, contrairement par exemple à msvc.. On peut critiquer GCC pour la vitesse de compilation (encore que, avec ccache sous linux ce n’est pas vraiment un souci), mais on peut dans la même phrase se souvenir que les binaires produits sont super rapides, et que le support des nouvelles normes arrive bien plus vite que chez Microsoft.

 On utilise c++11 autant que possible dans ma boîte, ca change vraiment la vie, presqu’un nouveau langage (mais toujours aussi rapide). Le meilleur de plusieurs mondes !


{{trololololo}}

booba à propos du développeur C “fouiny babe” : sale pointeur!{{/trololololo}}


La référence en matière de perf c’est quand même CLang. Même si GCC rattrape son retard.


en vitesse de compilation peut être. En vitesse du binaire pas vraiment, sans OpenMP Clang est un peu largué sur toutes les applications hautes performances… (ok, ca arrive)


Et typiquement sur du code fortement métaprog, clang est encore en retard sur les exécutables que peut produire gcc. Par contre effectivement, il est bien plus rapide pour compiler et l’affichage des erreurs est plus clair.



Par contre comparer les performances ça devient compliqué, en présence de code concurrent très bas niveau, les compilateurs font de toute façon des optimisations qui sont unsound, donc ça devient un peu chaud de déterminer lequel produit des exécutables rapides ET corrects <img data-src=" /> .








Mudman a écrit :



La référence en matière de perf c’est quand même CLang. Même si GCC rattrape son retard.





Il est rare que les programmes compilés par CLang soient plus performants que ceux produits pas gcc (en tout cas sur x86/x64) (selon les tests de Phoronix). Mais cela arrive effectivement.



Après, un écart de 5% sur un CPU est parfois un écart de 10% sur un autre CPU, ou carrément 5% dans l’autre sens. Donc si c’est 5%, c’est souvent non significatif si tu comptes déployer ton programme sur un parc hétérogène.



Si par contre tu connais ta cible, que ton calcul s’exécute sur des jours/semaines, 5% c’est la différence entre avoir le résultat le vendredi soir ou le vendredi dans la journée. donc là ça compte. Mais là certainement que tu as un calculateur à ta dispo, et dans la plupart des cas tu fais de l’OpenMP, donc tu as déjà évincé Clang+LLVM qui n’a pas encore de support.



Par contre, gcc est une horreur à utiliser je trouve, CLang a des messages d’erreur plus clairs et plus précis (il indique la ligne où est l’erreur, pas 1000 lignes plus bas…), il compile beaucoup plus vite et en utilisant facilement moitié moins de mémoire.

Sur un serveur de test automatisé, Clang c’est une ballade, gcc est une torture…









brokensoul a écrit :



Peut être pas assez présent dans la news, mais ca fait longtemps que C++11 était supporté, contrairement par exemple à msvc.. On peut critiquer GCC pour la vitesse de compilation (encore que, avec ccache sous linux ce n’est pas vraiment un souci), mais on peut dans la même phrase se souvenir que les binaires produits sont super rapides, et que le support des nouvelles normes arrive bien plus vite que chez Microsoft.

&nbsp;On utilise c++11 autant que possible dans ma boîte, ca change vraiment la vie, presqu’un nouveau langage (mais toujours aussi rapide). Le meilleur de plusieurs mondes !





C++ 11 a un support accru au fur et à mesure des version de VS . Il me semble que la version 2K15 aura un quasi full support.

http://blogs.msdn.com/b/vcblog/archive/2014/11/17/c-11-14-17-features-in-vs-2015…





&nbsp;



Sur quels benchs tu te bases ?

Moi j’ai toujours lu que Clang était plus rapide, en tout cas concernant le C++.

Par exemple ici.



Après GCC commence à intégrer les optimisations qui ont été développées dans Clang et donc s’améliore de version en version.



J’utilise pas OpenMP, j’utilise HPX qui est aussi réputé pour être plus rapide que OpenMP.


Super, merci pour l’éclaircissent du texte.


premier bench de ton lien, qui utilise openmp, gcc est N fois plus rapide (lié au nombre de processeurs et à la boucle openmp qui n’est pas déroulée). Je ne dis pas qu’il n’y a pas des situations dans lesquelles Clang n’est pas plus rapide, mais pour l’instant si tu te soucies de la performance de ton binaire, alors il y a de fortes chances que tu utilises OpenMP, et dans ce cas là Clang est hors jeu (pour l’instant). C’est un problème de support d’une norme, pas de qualité de Clang bien sûr, mais comme les autres différences entre compilos sont +-10% (hors benchs sur le temps de compilation, mais il y a pas mal de cas dans lesquels osef), ce support de OpenMP fait toute la différence


<img data-src=" />








Ksass`Peuk a écrit :



Par contre comparer les performances ça devient compliqué, en présence de code concurrent très bas niveau, les compilateurs font de toute façon des optimisations qui sont unsound, donc ça devient un peu chaud de déterminer lequel produit des exécutables rapides ET corrects <img data-src=" /> .





Quand on sait que en -O3 (pour GCC), le compilo garde autant que possible dans les registres CPU les variables locales et écrit sans trop attendre les variables globales, il y a rarement des mauvaises surprises.

Et il y a le préfixe “volatile” si tu veux vraiment être sûr.









brokensoul a écrit :



On utilise c++11 autant que possible dans ma boîte, ca change vraiment la vie, presqu’un nouveau langage (mais toujours aussi rapide). Le meilleur de plusieurs mondes !





Les programmeurs C++ me font penser à ces femmes battues qui prennent la défense de leurs maris.



Tu veux voir à quoi ressemble un langage bas-niveau moderne ? Regarde Rust. Tu verras la différence entre un langage de programmation et un empilage de bric et de broc. Le C++ 11, lui, n’a absolument rien de moderne : c’est toujours la même vieillerie anachronique et toxique.



ok pour hpx sinon, je ne connaissais pas, mais c’est une lib ? je vais regarder ca, merci pour l’info, on dirait du boost en plus digeste








HarmattanBlow a écrit :



Les programmeurs C++ me font penser à ces femmes battues qui prennent la défense de leurs maris.



Tu veux voir à quoi ressemble un langage bas-niveau moderne ? Regarde Rust. Tu verras la différence entre un langage de programmation et un empilage de bric et de broc. Le C++ 11, lui, n’a absolument rien de moderne : c’est toujours la même vieillerie anachronique et toxique.





<img data-src=" />

C et CPP c’est des jouets comme tu dis.

Depuis les temps que Rust existe et fait ses preuves, CPP aurait du être enterré depuis tant d’années :oui2:



Sinon, il faut lire quoi pour se tenir au jus et pas rester dans le toxique : Rust Ica Hebdo ?



Hmm, j’avais regardé Rust il y a quelques temps, c’est bien le truc qui n’est toujours pas fini ? Je ne dis pas qu’il n’y a pas mieux que c++11, mais il a le mérite d’exister :) Sinon le threading a l’air assez facile, mais le problème c’est aussi le contenu : tu fais quoi avec Rust ? Il existe des libs ? C’est aussi le souci avec ces nouveaux languages, sympa mais c’est rare que tu refasses tout de zéro, tu prends aussi des libs existantes dans la vraie vie. Plus facile d’innover aussi quand tu te fous de la compatibilité ascendante..








kade a écrit :



C et CPP c’est des jouets comme tu dis.

Depuis les temps que Rust existe et fait ses preuves, CPP aurait du être enterré depuis tant d’années :oui2:





a) J’ai dit que CPP était un empilage de bric et de broc, pas un jouet.

b) La première version alpha de Rust ne date que de 2012. Cela dit il est dores et déjà utilisé pour écrire Firefox OS qui fait tourner certains smartphones.







brokensoul a écrit :



C’est aussi le souci avec ces nouveaux languages, sympa mais c’est rare que tu refasses tout de zéro, tu prends aussi des libs existantes dans la vraie vie. Plus facile d’innover aussi quand tu te fous de la compatibilité ascendante..





Bien sûr, je ne dis pas qu’il peut aujourd’hui remplacer le C++ partout, même si ça viendra. J’ai simplement voulu fournir un point de comparaison pour souligner que le C++ est aussi moderne que Fortran ou Cobol.



Mais bien sûr le C++, Fortran et Cobol demeurent indispensables.









HarmattanBlow a écrit :



Mais bien sûr le C++, Fortran et Cobol demeurent indispensables.







OK. Ne peut-être pas oublier le F# dont j’ai entendu le plus grand bien.



Et comme le disais brokensoul, avec raison, il faut une sacrée implantation (et tant de temps…) pour implanter un langage, surtout en open. Quid de la pérennité, celle de la communauté ?



Vas faire entendre ça à un DSI dans une grosse boite, ou faire entendre à de gros comptes depuis une petite SSII…



(aucune critique de ma part de Rust ou autre tu remarquera).




Euh non, Clang compile plus vite mais GCC produit du code plus rapide :http://linuxfr.org/users/patrick_g/journaux/gcc-vs-llvm


Je ne connaissais pas Rust, je suis dev c++ et j’avoue que je trouve ca pas mal, surtout que j’ai pas mal réfléchie à comment faire de la programmation fonctionnelle en c++.

Tu aurait pu rajouter que Rust est un langage natif et que en tant que tel il pourrait linker avec d’autre langage natif (mais je ne suis pas certain que ce soit déjà possible, le C certainement, le C++ j’en doute)








kade a écrit :



OK. Ne peut-être pas oublier le F# dont j’ai entendu le plus grand bien.





Mais F# cible un domaine très différent, on ne peut pas le comparer à Rust qui se place vraiment en compétiteur du C++, pour de la programmation bas-niveau (mais pas système, plutôt le domaine réservé du C).



Chaque langage a son domaine en raison ses spécificités.

* Les applicatifs lourds ont besoin de langages puissants, faisant abstraction de toute considération bas-niveau (mémoire), mais rigides pour faciliter la maintenance (système de types). C# / Java.



* Pour des incrémentations rapides, de la recherche ou du RAD dans lequel on ne mettra plus jamais les mains mieux vaut un typage dynamique et surtout de très bonnes biblios. Javascript, Php, F#, Python, Haskell.



* Pour les systèmes embarqués il faut souvent un langage bas-niveau extrêmement vérifiable, permettant au compilateur de prouver un large nombre de propriétés dont le déterminisme dans les circonstances les plus extraordinaires : la régulation de la vitesse d’un véhicule ne doit pas être affectée par un éventuel débordement de la pile d’appels. Ada.



* Pour du calcul scientifique il faut une solution qui facilite le parallélisme distribué : immutabilité, distribution, réplication, synchronisation. C++ MPI, Haskell, Go, F#.



* Pour de la grosse analyse statistique il faut un langage capable d’exprimer effacement certaines concepts mathématiques tout en bénéficiant de très bonnes libs. R, F#, Python.



* Pour du temps réel critique il faut une gestion mémoire déterministe, un découplage en composants parallèles pouvant redémarrer individuellement à la volée et du patchage à chaud. Erlang.



* Pour de la performance et la capacité à dialoguer directement avec le matériel il faut du bas-niveau. C++, Rust.





Et comme le disais brokensoul, avec raison, il faut une sacrée implantation (et tant de temps…) pour implanter un langage, surtout en open. Quid de la pérennité, celle de la communauté ?



Pour Rust je pense qu’on peut être tranquille : celui-ci est soutenu par la fondation Mozilla, plusieurs dizaines de leurs ingénieurs travaillent avec, ainsi que certains constructeurs de smartphones, et la communauté commence à être assez large (67 personnes visitent à l’instant même le reddit Rust).



Mais, oui, un DSI a souvent raison d’attendre et il y a bien des freins légitimes à résoudre avant qu’un langage puisse remplacer le C++ dans un projet.







Tkop a écrit :



Tu aurait pu rajouter que Rust est un langage natif et que en tant que tel il pourrait linker avec d’autre langage natif (mais je ne suis pas certain que ce soit déjà possible, le C certainement, le C++ j’en doute)





C’est possible pour le C depuis le début, quant au C++ c’est plus compliqué à cause de certaines de ses fonctionnalités qui n’ont pas d’équivalent côté Rust (pas de pointeurs de fonctions membres car directement remplacés par des lambdas) et de concepts spécifiques au C++ (enums bizarres). Ça devrait s’améliorer avec le temps.









Mudman a écrit :



La référence en matière de perf c’est quand même CLang. Même si GCC rattrape son retard.





Clang est surtout utile pour son côté libre comme dans “libre comme l’air”.

CLang a été choisi par FreeBSD non pour les perfs, mais pour se libérer de cette fichue GPLv3.



Là c’est une véritable guerre de religion: les libristes “à la linux” où ce qui est libre doit rester libre, et les libristes “à la BSD” où tu fais ce que tu veux du code, pas d’obligation de rendre les modifs libres. En gros.



Maintenant, j’ai quand même des échos où Clang+LLVM a de bonens perfs sur d’autres archis que x86, et surtout que pour toute nouvelle archi LLVM est plus facile à porter.



Enfin, LLVM, quoique moins performante sur le papier, a été intégrée à plein de projet et contenu de l’être pour sa versatilité et sa capacité à créer un code natif optimiser on the fly.









HarmattanBlow a écrit :



Pour Rust je pense qu’on peut être tranquille : celui-ci est soutenu par la fondation Mozilla, plusieurs dizaines de leurs ingénieurs travaillent avec, ainsi que certains constructeurs de smartphones, et la communauté commence à être assez large (67 personnes visitent à l’instant même le reddit Rust).





Silverlight était une technologie soutenue par Microsoft … ca ne l’a pas empêcher de couler… (bien que le support du Framework .Net soit présent)



Les nouvelles techno ou langages c’est bien mais il faut derrière s’assurer que ça répond à un besoin et&nbsp; de la pérennité du produit.



Merci pour toutes tes précisions. Je “regarderai” à l’occasion.

Perso, hormis les L4G sous Windows (terriblement pratiques pour les applis de gestions communes mais à haute V.A.), moi c’est le C (‘aske j’le veaux bien).

“Niveau bas niveau” ouais c’est (trop) le top.

Par contre, je ne connais pas vraiment le CPP par manque de pratique, et je ne vois pas dans ton argumentaire en quoi il ne pourrait pas être adapté au dév. de bas niveau.

OK, dans l’affaire, c’est moi le “bas niveau” (<img data-src=" />), je ne suis qu’un vieux schtroumpf de CC


+1

Je crois me souvenir que C# a au moins 15 ans (ou 20). A l’époque, il fallait des dizaines de lignes de code mal maîtrisées pour se connecter à une BDD, et je parle pas du SQL…

A la même époque, des L4G permettaient déjà de coder dans le dur en multi-plateforme et en client/serveur. OK, il ne s’agit pas de lourds calculs, ni de jeux, etc. mais de besoins de programmation qui répondaient à la demande du marché.



Maintenant, pour faire de la saisie prédictive temps réel dans un champ basée sur un big data, je dis pas :)



Pour les technos en entreprises, les DSI ont peur, surtout de l’open source en raison des problèmes de responsabilités en cas de ratage. Pas de support Microsoft contractuel Monsieur ? -&gt; Au revoir. La hantise.

Pas chez Orange (même si ça merde) ? -&gt; la hantise. Etc, etc.



Je ne connais personne qui met en jeu la vie de sa boite et de tous ses salariés (genre +100, +300…) sur de l’open source et des langages où on ne trouve personne. C’est malheureux mais c’est ce que je constate.



Le support des normes C++ est plus rapide depuis VS2013, même si c’est encore en retard dérrière Clang et GCC pour le C++14, mais l’intégralité des améliorations principales sont là








kade a écrit :



Par contre, je ne connais pas vraiment le CPP par manque de pratique, et je ne vois pas dans ton argumentaire en quoi il ne pourrait pas être adapté au dév. de bas niveau.





Beaucoup de fonctionnalités du C++ sont dangereuses en kernel mode.



* Tu réponds à un IRQ en appelant une méthode virtuelle ? Pas de bol, la VTABLE était en mémoire paginée et elle est couramment indisponible. Du coup, c’est l’héritage lui-même qui devient dangereux. Même problème avec les RTTI.



* Tu peux également oublier les exceptions et tu devras passer par les fonctions d’allocation système donc pas de new.



Alors, certes, tu peux toujours écrire du C et prétendre que c’est du C++. Mais c’est un appel de pied au danger pour un bénéfice nul.







kade a écrit :



Je ne connais personne qui met en jeu la vie de sa boite et de tous ses salariés (genre +100, +300…) sur de l’open source et des langages où on ne trouve personne. C’est malheureux mais c’est ce que je constate.





C/C++, Php, Javascript, … Il me semble que les langages ouverts ont un joli passif.

Quant au reste, dans la mesure où la moitié des serveurs mondiaux tournent sous Linux, là aussi je dirais que tout va bien.



Le fait est qu’il y a nombre de prestataires de service open source. Que l’open source puisse rebuter, oui, mais tout autant que le propriétaire dans d’autres circonstances (avoir le support d’un gros acteur c’est bien, te retrouver à la merci d’un unique gros acteur pour toute correction de bug, fonctionnalité ou support c’est moins bien). Et de là à dire que “personne ne met en jeu la vie de sa boîte et de tous ses salariés sur de l’open source”, c’est un propos déconnecté de la réalité en 2015.



Pas d’accord, je pense comme @HarmattanBlow que c’est déconnecté de la réalité, l’open source a fait ses preuves sur des gros projets. Dans les technos web même pas la peine d’en parler tellement c’est évident, l’open source est la règle, mais même dans des trucs c++ un peu plus bas niveau, des libs comme boost, thrust ou opencv sont largement utilisées (dans mon champ de compétences en tout cas). Je suis dans une grosse startup (15 personnes), heureusement qu’on utilise de l’open source. La garantie microsoft sur les produits, je ne suis pas sûr que ce soit vraiment un facteur de décision, à part peut être pour quelques vieux DSI restés en 1980

&nbsp;








brokensoul a écrit :



je ne suis pas sûr que ce soit vraiment un facteur de décision, à part peut être pour quelques vieux DSI restés en 1980





Peut-être <img data-src=" />









vampire7 a écrit :



Quand on sait que en -O3 (pour GCC), le compilo garde autant que possible dans les registres CPU les variables locales et écrit sans trop attendre les variables globales, il y a rarement des mauvaises surprises.

Et il y a le préfixe “volatile” si tu veux vraiment être sûr.





Non, ça ne suffit pas. Loin de là surtout si tu veux des performances (et sur de la concurrences très bas niveau, tu veux de la performance). Voir l’article récent de Vafeiadis et al. sur les optimisations de compilateurs.









tazvld a écrit :



Plus qu’à attendre que tout le monde se mettent à jour…

…. et je crains que le processus dure encore plus longtemps que la disparition d’IE6.





T’inquiète, on est dans le monde du libre, là. Les projets bien vivants vont vite profiter des améliorations, surtout si c’est dans le sens de la performance.









HarmattanBlow a écrit :



…Ton post n° 28 …





Tu m’as l’air bien calé en langages. As-tu entendu parler du langage D et de son implémentation DMD ? En fait, j’ai un programme en Python qui fait appel à des listes et des piles de structures, et je voudrais le porter dans un langage compilé pour une exécution plus rapide. J’ai tenté en C, mais me retaper 10 lignes pour l’équivalent d’un push ou d’un pop en Python ça me saoule, et c’est source d’erreurs.



As-tu regardé du coté de Cython?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://cython.org/








Ksass`Peuk a écrit :



Non, ça ne suffit pas. Loin de là surtout si tu veux des performances (et sur de la concurrences très bas niveau, tu veux de la performance). Voir l’article récent de Vafeiadis et al. sur les optimisations de compilateurs.





Je ne parle pas d’une info que j’aurais vaguement lue quelque part, je parle de ce que je vois et de ce que je fais, avec un temps fou passé à regarder le code ASM produit par le compilo.

Malgré ça et un projet faisant des calculs sur un nombre arbitraire de threads, je tombe sur un vrai bug du compilo à peine une ou deux fois par an.

Je maintiens donc, du moins pour la version 4.7 de GCC, que savoir à quel moment les variables sont écrites en mémoire est en général suffisant pour obtenir un code parfaitement stable.



Par contre, pour parler de bizarreries et de performances, j’aurais plutôt envie d’évoquer l’option -O1 qui produit parfois un code plus rapide que -O3, surtout en 32 bits… (toujours avec GCC 4.7)

Franchement, je me fous complètement des méthodes d’optimisation employées ou de la norme du C. Pour moi c’est juste de la littérature. Tout ce qui m’intéresse, c’est le code produit et la vitesse à laquelle ça tourne. Et malgré tout, je veux aussi un code un minimum lisible (au moins par moi <img data-src=" />), et c’est bien la seule raison pour laquelle je ne me mets pas à l’assembleur (bien que j’en ai déjà fait sur plusieurs machines il y a une vingtaine d’années).









CaptainDangeax a écrit :



As-tu entendu parler du langage D et de son implémentation DMD ?





Je connais, oui, mais sans avoir d’expérience personnelle avec lui. Cela dit de ce que j’en sais c’est un bon choix : productif avec de bonnes performances. Mais à mon avis elles resteront légèrement en retrait de ce que tu pourrais obtenir avec le C.



Si je devais les mettre sur une échelle…

* C/C++ : 1

* D : 1.5

* C# : 2

* Java : 2.5

* Haskell : 2.5-10

* Python : 50



* J’ai mis le C++ au même niveau que le C car par rapport à ce dernier le C++ ne fait que t’offrir des choix supplémentaires, entre abstractions et performances. Si tu ne veux pas les utiliser, libre à toi, mais garde à l’esprit qu’une méthode de classe ne coûte pas plus cher qu’une fonction à laquelle on passe une struct en premier argument.



* Le D ensuite parce qu’il peut échapper au GC (pas de surpoids) et inclure de l’ASM (note que si tu voulais utiliser des instructions SIMD le fossé se creuserait rapidement à l’avantage du D/C/C++). Par ailleurs il utilise LLVM ce qui donnera de bonnes performances. Cela dit je me demande à quel, point il peut exposer des mécanismes unsafe avec son GC, à moins d’avoir un mauvais GC (non-compactant).



* C# après ça grâce à ses structs (existence sur la pile, pas de surpoids dû au GC) et son code unsafe. Gare à utiliser un bon compilo toutefois (les plus récents de MS).



* Java : avec lui tu devras toujours payer la taxe d’un univers sécurisé (surpoids du GC et effets sur le cache, vérifications des indices du tableau).



* Haskell : très variable parce que certains algorithmes et structures de données ne sont pas du tout adaptés aux langages fonctionnels.



* Python : c’est du typage dynamique, pas de miracle. Le JIT ne change pas grand chose à l’affaire. La seule exception c’est JS parce qu’il a des compilateurs extrêmement avancés capables d’inférer un code statique équivalent et de complètement abandonner le côté dynamique quand c’est possible.







46 75 63 6b 20 6f 66 66 a écrit :



As-tu regardé du coté de Cython?





C’est une excellente suggestion. Par contre pour vraiment obtenir une amélioration il faut quand même définir des classes et réécrire une bonne partie du code pour y ajouter les annotations de types. Et après ça on restera au mieux dans l’intervalle d’un C#/Java.









HarmattanBlow a écrit :



C’est une excellente suggestion. Par contre pour vraiment obtenir une amélioration il faut quand même définir des classes et réécrire une bonne partie du code pour y ajouter les annotations de types. Et après ça on restera au mieux dans l’intervalle d’un C#/Java.





Il faut effectivement reprendre ses classes pour définir les types et utiliser des fonctions bas niveau quand c’est nécessaire. Après, niveau perfs, on est plutôt proche du C++. Et niveau usage, le module une fois compilé s’utilise comme un simple module python.









46 75 63 6b 20 6f 66 66 a écrit :



Il faut effectivement reprendre ses classes pour définir les types et utiliser des fonctions bas niveau quand c’est nécessaire. Après, niveau perfs, on est plutôt proche du C++. Et niveau usage, le module une fois compilé s’utilise comme un simple module python.





Dans la mesure où ils doivent conserver un ramasse-miettes, une vérification des bornes des tableaux, une vérification des instances nulles, une vérification des dépassements d’entiers, des membres variants, un support pour les appels dynamiques, etc - des surcoûts très importants demeurent forcément. Le surpoids des en-têtes des objets et du code est significatif, avec ce que ça implique pour le cache CPU. Plus bien sûr les cycles supplémentaires.



Quant à optimiser cela tu peux oublier : le module compilé reste un module python normal dont chaque méthode et chaque champ peut être manipulé de n’importe quelle façon par l’appelant. Donc impossible de faire une analyse extensive (pas de “whole program optimization”)



Il me semble impossible d’atteindre des performances simplement égales au Java.









46 75 63 6b 20 6f 66 66 a écrit :



Portant le projet arrive à de bonnes performances:

http://www.matthiaskauer.com/2014/02/a-speed-comparison-of-python-cython-and-c/

&#160http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/maste…





Ce sont des tests sur une simple boucle sur un tableau, se déroulant entièrement au sein d’une méthode (là où aucun code externe n’ira mettre ses gros doigts, laissant le compilateur libre d’inférer des certitudes) et ne faisant pas intervenir le parcours d’un graphe d’objets par exemple (ce qui aurait mis en évidence le coût du surpoids de chaque objet).



N’importe quel langage avec un JIT correct en fait autant (*). JS le faisait en 2000, Lua le fait, etc. Mais ces belles démos ne sont pas révélatrices des performances dans un cas ordinaire.



(*) J’exagère : ils se sont débrouillés pour prouver que tous les indices sont dans l’intervalle du tableau, ce qui n’était pas trivial ici.









vampire7 a écrit :



Je ne parle pas d’une info que j’aurais vaguement lue quelque part, je parle de ce que je vois et de ce que je fais, avec un temps fou passé à regarder le code ASM produit par le compilo.





Qui a dit j’avais “vaguement” lue cette info ? Les modèles mémoire faibles, en particulier celui de C++11 et ses implications sur le parallélisme bas-niveau, c’est un sujet plutôt fertile en ce moment dans la recherche. Et les gens qui en parlent (Vafeiadis, Zappa Nardelli, Alglave …) c’est pas des glandus.

Et grosso-modo, à moins de rendre tout volatile (et bon ben adieu les performances), les cas d’erreur qui peuvent tomber une fois tous les cent milles exécution mais qui provoquent derrière de vrais bugs peuvent être produit par des optimisations qui bien que sound dans le cas d’un code séquentiel ne le sont plus dans le cas concurrent.



Evidemment, ça arrive pas tous les trois jours (enfin sauf si tu t’amuses à construire les exemples qui vont mettre la bringue dans le compilo), mais quand un code plus rapide parce qu’optimisé provoque un crash violent dans une application qui tourne H24/J7, que le bug tombe aléatoirement tous les 3 ou 4 jours dans une fonction exécutée 30k fois à la minute et que c’est dû à une optimisation trop méchante du compilo sur du code valide, tu l’as mauvaise.



Bon je n’ai pas pu éditer à temps, donc mon edit :



Le modèle C++11 est plutôt bien foutu mais il y a encore quelques soucis à régler pour que le degré de confiance qu’on est sensé lui accorder soit effectivement celui qu’on a même en présence d’optimisations. En particulier, pour du code concurrent très bas niveau, où grosso modo la preuve devient plus facile et bien plus fiable que le test, on aimerait que lorsque l’on établit une preuve de correction en prenant en compte le modèle mémoire, le compilateur n’est pas susceptible de tout casser lors de la phase d’optimisation (à noter : Compcert TSO est sensé apporter ce genre de garanties pour C11, mais je ne sais pas où en est son développement).








Ksass`Peuk a écrit :



Qui a dit j’avais “vaguement” lue cette info ?





C’est toi qui suggère que je ne parle pas par expérience. Je suis l’auteur d’une application de chiffrement de fichier par volume et à ma connaissance, seul DiskCryptor est plus rapide, grâce au fait que tous ses algos sont en ASM pur. En pur C, sur tout ce que j’ai essayé, j’ai le record absolu de performance. Mon implémentation en C d’AES est même plus rapide que celle en ASM de TrueCrypt…

Et sur ce genre d’appli, pas question d’avoir une fiabilité approximative, parce qu’il est question de la chose la plus précieuse pour les utilisateurs : leurs données.



Alors oui, les compilateurs ont des bugs, mais ça reste des bugs, c’est-à-dire des choses qui ne sont pas censées survenir. Pour ma part, je n’ai eu qu’un seul vrai bug lié aux optimisations de GCC. En revanche, j’ai eu à de nombreuses reprises des trucs délirants à propos des headers.



Quoi qu’il en soit, pour moi, GCC 5.0, ce sera comme les autres : je compile, je compare, et s’il n’y a pas moyen d’avoir un code aussi compact et rapide qu’avec la version 4.7, ce sera direct à la poubelle, C11 ou pas.



Au fait, tu devrais arrêter de parler de “code concurrent” : la programmation concurrente, ça peut être aussi l’accès à une ressource système partagée à travers différents processus. Il n’est évidemment pas question de ça ici. L’accès aux ressources du système implique des appels à l’API du système, et ces appels de fonction ne sont jamais supprimés, jamais, même en -O3.

Mis à part les bugs, les optimisations de compilateur ne peuvent affecter que la programmation multi-threads (et certains aspects de sécurité comme les buffers non effacés parce qu’ils ne sont plus accédés par la suite).



Moi, le problème auquel je dois le plus faire face, c’est l’imprécision, voire les erreurs, de la documentation de Microsoft, et parfois même celle de GCC. Ça, c’est une source quasi-quotidienne de problèmes et de bugs. Tiens, l’exemple du jour : FSCTL_LOCK_VOLUME.

“The system flushes all cached data to the volume before locking it. For example, any data held in a lazy-write cache is written to the volume.”

Cool, à condition de savoir que sur les systèmes antérieurs à Windows XP, ce n’est pas le cas. Et en cas d’échec du lock, les buffers sont quand même vidés ou pas ? Ben on sait pas.

Malgré ça, je préfère quand même lire de la doc plutôt que les réflexions des grands penseurs de la programmation.









vampire7 a écrit :



Au fait, tu devrais arrêter de parler de “code concurrent” : la programmation concurrente, ça peut être aussi l’accès à une ressource système partagée à travers différents processus. […]





Oui enfin, quand on parle de code qui peut accéder à une même adresse mémoire, ça reste du code concurrent, même si le code concurrent ça inclut aussi l’accès aux ressources systèmes. C’est pas moi qui ait choisi le nom. Et comme le code multi-thread n’est pas nécessairement concurrent, j’éjecte ce terme, parce que s’il n’y a pas d’accès concurrent, le problème est facile.



&nbsp;





vampire7 a écrit :



Malgré ça, je préfère quand même lire de la doc plutôt que les réflexions des grands penseurs de la programmation.





Et c’est généralement à partir de là que j’arrête de répondre. Les grands penseurs en question, ils se sont cassés le cul à transformer d’énormes passages de documentation (la norme) complètement imprécise en formalisation, en la gardant compréhensible par un humain (c’est d’ailleurs comme ça qu’ils ont trouvé pas mal de bourdes dedans). L’idée de “j’en ai rien à carrer c’est juste des scientifiques qui se font mousser, pas besoin de les écouter”, quand elle tombe, j’abandonne le dialogue.









KsassPeuk a écrit :



Oui enfin, quand on parle de code qui peut accéder à une même adresse mémoire, ça reste du code concurrent, même si le code concurrent ça inclut aussi l'accès aux ressources systèmes. C'est pas moi qui ait choisi le nom. Et comme le code multi-thread n'est pas nécessairement concurrent, j'éjecte ce terme, parce que s'il n'y a pas d'accès concurrent, le problème est facile.





Alors il va falloir que tu corriges l'article de Wikipedia. Je pense que si tu supprimes discrètement la ligne sur la concurrence disjointe, ça devrait mieux coller à tes idées. <img data-src=">







Ksass
Peuk a écrit :



Et c’est généralement à partir de là que j’arrête de répondre. Les grands penseurs en question, ils se sont cassés le cul à transformer d’énormes passages de documentation (la norme) complètement imprécise en formalisation, en la gardant compréhensible par un humain (c’est d’ailleurs comme ça qu’ils ont trouvé pas mal de bourdes dedans). L’idée de “j’en ai rien à carrer c’est juste des scientifiques qui se font mousser, pas besoin de les écouter”, quand elle tombe, j’abandonne le dialogue.





Reste à savoir en quoi connaitre ces noms, ou même lire leurs articles, permet d’optimiser ou de débuguer un programme.

Moi, je me “casse le cul” comme tu dis à optimiser à mort certains de mes programmes, c’est pas pour qu’une nouvelle norme vienne tout foutre en l’air.



Sur ce, je vais donc te laisser avec tes dieux de la programmation. N’étant pas croyant, la communication risquerait effectivement d’être difficile.