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

Langages de programmation Discussion :

C# versus C++ en vitesse d'exécution dans quels cas sont ils les plus rapides ?


Sujet :

Langages de programmation

  1. #1
    Expert éminent sénior

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 320
    Points : 27 371
    Points
    27 371
    Billets dans le blog
    1
    Par défaut C# versus C++ en vitesse d'exécution dans quels cas sont ils les plus rapides ?
    C# versus C++ en vitesse d'exécution dans quels cas sont ils les plus rapides ?
    David Bolton effectue un cas particulier de micro benchmark avec les deux langages

    Généralement C++ est reconnu comme étant un des langages les plus rapide en vitesse d'exécution. David Bolton se présente comme un développeur expérimenté et il est le fondateur de la société Bespoke Programmers qui a longtemps travaillé avec les langages C# et C++. Dans une de ses publications, il s’est intéressé à la vitesse d’exécution de ces deux langages pour déterminer lequel était plus rapide que l’autre. Pour ce faire, il a écrit un programme en C++ qu’il a ensuite traduit en C# et comparé les deux versions du programme à leur exécution. La comparaison des temps d’exécution des deux versions du programme a montré que la version C# s’est exécutée deux fois plus vite que la version C++, ce à quoi il ne s’attendait pas. En effet, avec les nouvelles versions de C++, le langage est devenu beaucoup plus puissant avec des ajouts de nouvelles fonctionnalités. Celles-ci couplées au fait que C++ utilise des caractères codés sur 8 bits alors que C# utilise des caractères codés sur 16 bits, David croyait qu’il serait plus rapide à l’exécution. Cependant il s’est rendu compte que C# pouvait être aussi rapide, voire plus si on fait les bonnes optimisations.

    Pour mieux nous faire comprendre, David nous fait entrer dans son code pour en expliquer le principe. Le programme en question, écrit en C++ crée un fichier texte générant automatiquement des cartes de poker représentées par deux caractères chacune (exemple : DP = Dame de Pique). Le programme lit ensuite les données de ce fichier et écrit le temps mis dans un autre fichier (10 caractères par ligne). Cela a pris 3.5 secondes au programme écrit en C++ pour finir de lire le fichier entier qui contient la représentation d’un million de cartes. La version C# du même code a pris seulement 1,7 seconde pour s’exécuter soit une vitesse d’exécution deux fois plus grande que la version C++.

    On ne peut cependant pas déduire une généralité pour une comparaison en se basant sur ce seul micro benchmark comme il semble vouloir le faire penser, pouvez-vous expliquer pourquoi vous êtes de son avis, ou d'un avis contraire ?


    Nom : Capture.PNG
Affichages : 7441
Taille : 216,1 Ko

    Sources : Code source sur github & Article sur Dice

    Et vous ?

    Pensez-vous que C# peut être parfois plus rapide dans certains cas que C++, ou dans quels cas C# peut être plus rapide que C++ d'après votre expérience personnelle ?
    Avez-vous des benchmarks ou des micro benchmarks à proposer qui montrent dans quel cas C++ ou C# sont les plus rapides ?

    Voir aussi

    le forum Langage de programmation

    la rubrique générale Développement

  2. #2
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 88
    Points : 447
    Points
    447
    Billets dans le blog
    1
    Par défaut
    Ou comment dire autrement que :
    - Le compilateur C# se base sur un ensemble de librairies qui sont optimisés pour bon nombre de processeurs.
    - Lancer la compilation d'un projet C++ sans les options d'optimisations peux ne pas fournir les meilleurs performances.

    Si on part sur ces mêmes principes, on peux dire que Java est plus rapide que C.

  3. #3
    Membre extrêmement actif
    Avatar de benjani13
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2010
    Messages
    615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2010
    Messages : 615
    Points : 2 824
    Points
    2 824
    Par défaut
    Cela a pris 3.5 secondes au programme écrit en C++ pour finir de lire le fichier entier qui contient la représentation d’un million de cartes. La version C# du même code a pris seulement 1,7 seconde pour s’exécuter soit une vitesse d’exécution deux fois plus grande que la version C++.
    Ce serait peut être plus intéressant de faire des tests autre que de la lecture de fichier (qui dépend donc du temps d’accès au disque). Ou alors on ne parle pas de ces langages dans leur globalité mais juste de leur gestion des fichiers.

  4. #4
    Membre éprouvé
    Homme Profil pro
    -
    Inscrit en
    Octobre 2011
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Octobre 2011
    Messages : 344
    Points : 1 234
    Points
    1 234
    Par défaut
    Quand est-ce que les programmeurs arrêterons de faire un programme écrit par une personne éxécuté une fois ou presque sur une machine et s'écrier X est plus rapide que Y!

    Non pas que je doute du résultat, il y a surement des optimisations dans une vm qui permette d'éviter de la redondance, mais utilisons un échantillon un minimum significatif avant de sortir des conclusions.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 239
    Points
    20 239
    Par défaut
    Les sources :
    Code : https://github.com/David-H-Bolton/PokerEval
    Article : http://insights.dice.com/2015/12/09/...h-c-for-speed/

    Suis pas expert de l'optimisation C++ , mais dans les commentaires de l'article pas mal de lecteur explqiue que le code C++ est loin d'être optimisé.

    Donc on peut sans doute conclure qu'il est plus difficile d'écrire du code performant avec C++ qu'avec C# mais de là à dire que C# est plus performant que C++ ...

  6. #6
    Membre émérite
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Points : 2 678
    Points
    2 678
    Par défaut
    Merci à grunk pour les sources.

    Apparemment, ce « développeur expérimenté » se contente de « s’étonner » sans même approfondir ou soumettre une hypothèse pour expliquer ce résultat « surprenant ».

    Comparer du code managé avec du code compilé est toujours très délicat car :
    • dans le premier cas, la machine virtuelle décharge en partie le développeur des détails techniques les plus fins de son programme,
    • dans le second cas, au contraire, le développeur est entièrement responsable du fonctionnement de son programme. Les optimisations ne se font pas automatiquement et un mauvais choix d’options de compilation peut désavantager du binaire face à du bytecode.


    [Précisions supplémentaires]
    Après consultation des sources et des commentaires, les faiblesses du code C++ semblent être les suivantes :

    1. La méthode std::getline est lente.
    2. L’objet std::string n’est jamais modifié et pourrait être remplacé par la valeur qu’il encapsule.
    3. Utiliser std::endl dans la boucle rend le cache inefficace.
    4. return ToString() + " " + ValueStr[(int)handvalue]; contient une concaténation peu efficace.
    5. Active par défaut, la synchronisation des flux C++ (iostream) avec les flux C (stdio) est inutile dans cet exemple et peut être désactivée pour gagner en performance.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 99
    Points : 303
    Points
    303
    Par défaut
    Comme d'autres l'ont dit, le code C++ est loin d'être optimal. Ce gars à l'air moins à l'aise que moi au C++ alors que ça fait trois ans que j'ai rien écris en C++.

    Si ça révèle un truc c'est effectivement qu'écrire du code pas optimal en C++ c'est quasiment le comportement par défaut du langage (et les tutos n'aident pas, par exemple à bien comprendre les streams, le buffering etc...).

    Daniel

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    C'est pourquoi ce genre de tests doit passer par du code modifiable par la communauté (car personne n'est expert dans tous les langages).

    Comme l'avait fait TechEmpower pour des tests de langages serveurs Web.

    Après, c'est clair que des perfs deux fois meilleures, il y a baleine sous gravillon.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Victor Vincent Voir le message
    Pensez-vous que C# soit plus rapide que C++, d'après votre expérience personnel ?
    Non, et pourtant je suis fan de C#.

    C'est tout le problème des micro-benchmarks comme a fait l'auteur de l'article : c'est très difficile de comparer les choses de façon significative.

    De ce que j'ai vu de son article (ici), il n'a pas l'air de donner le code C# équivalent, donc difficile de dire si ça fait vraiment la même chose.

    Ensuite il prend un exemple plus basique : copier un fichier vers un autre. Et là il dit :

    So now it’s just a simple “read from the in stream” then “write to the out stream,” inside a loop. Running the C++ version took 2.39 seconds for all million rows. When I did the same using the StreamReader() and StreamWriter() classes in C#, it took just 0.11 seconds, over twenty times faster. Clearly the Windows stream I/O classes std::ifstream and std::ofstream are quite slow in comparison to those .NET stream classes.
    Sauf qu'il oublie un petit détail : le cache du système de fichier ! C'est beaucoup plus rapide de relire un fichier qu'on a déjà lu il y a peu de temps.

  10. #10
    Membre émérite
    Inscrit en
    Janvier 2011
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Janvier 2011
    Messages : 805
    Points : 2 919
    Points
    2 919
    Par défaut
    Je ne comprends pas non plus la petite image "Why C# is better than C++". Sortir de tels jugements à l'emporte pièce sur la seule base de la rapidité d'exécution d'une implémentation précise d'un algo particulier, c'est soit de la provoc' gratuite soit la preuve d'une limitation cérébrale assez confondante.

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Moué au final ça compare choux et carottes, article useless, next

    La seule conclusion à apporter à le lire serait : "C# est plus rapide que C++ dans la manipulation de fichiers", et comme le pointe tomlev, faut prendre en compte le cache. Quand on fait du benchmark, on exécute des milliers de fois pour avoir un éventail de valeurs.

  12. #12
    Membre régulier
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    Cet article me fait penser à un autre que j'ai récemment vu opposant PHP 7.0 à HVMM et sur lequel j'ai déposé un avis qui sera globalement similaire à celui-ci.

    Ces chiffres ont-il réellement de l'importance ? Je vois souvent au détour du web certain cherchant en permanence à prouver que "ceci" est mieux que "cela".

    Je pense sincèrement que ces articles montre une chose : La mise en concurrence de plusieurs produits, sur différents aspects (les performances dans le cadre des langages) tend à améliorer ces dits produits.

    Après, soyons honnête : De débattre (en campant sur ces positions) de C++ ou C# lequel est le plus performant, est-il réellement utile ? Le monde logiciel s'améliore en permanence, et ça, c'est une excellente chose.

    Amicalement,

  13. #13
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Je test un use case particulier: i.e lecture/écriture dans un fichier et j'en déduit une généralité concernant la vitesse d'exécution de tel au tel language . C'est parfait.

  14. #14
    Membre extrêmement actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Points : 739
    Points
    739
    Par défaut
    Citation Envoyé par grunk Voir le message
    Les sources :
    Code : https://github.com/David-H-Bolton/PokerEval
    Article : http://insights.dice.com/2015/12/09/...h-c-for-speed/

    Suis pas expert de l'optimisation C++ , mais dans les commentaires de l'article pas mal de lecteur explqiue que le code C++ est loin d'être optimisé.

    Donc on peut sans doute conclure qu'il est plus difficile d'écrire du code performant avec C++ qu'avec C# mais de là à dire que C# est plus performant que C++ ...
    Après un rapide coup d'oeil sur le code, on peut déjà voir que les std::string sont passés par copies et non par références. Je me suis arrêté la. Pas besoin d'en voir plus. Le type ne maitrise visiblement pas le c++.


    Edit : En fait, il écrit du C++ comme on écrit du C#.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 72
    Points : 289
    Points
    289
    Par défaut La banane parfois ca ressemble... à un fruit, mais pas tout le temps.
    Comprendrai jamais ce genre d'article d'un autre age.

    A mon tour :
    Aujourd'hui un test avec un résultat qui va vous laisser sur le c*** :
    Le vélo dans Paris c'est plus rapide que la voiture (mais parfois non, mais souvent oui)

    Demain : Python c'est lent

    Après demain : PHP c'est nul

    La semaine pro : Linux c'est génial, Windows c'est de la merde (et M$ c'est le mal)



  16. #16
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Comme d'autres ont dit, il y a tellement de choses qui faussent les résultats...

    1) L'ensemble C# & libs a-t-il un traitement autour des fichiers que C++ n'a absolument pas ? (genre bufferisation de fichiers/réduction du nombre de syscalls sous-jacents.......)

    2) Quid du code ?... (et apparemment les passages par copie au lieu des réfs démontrent une méconnaissance totale des bases de la prog OU une volonté totale de fausser les perfs)

    3) "un" test. Nan mais l'époque du benchmark en UN test c'est fini.

    4) Il me semble que déplacer 8 bits "aujourd'hui sur des x64" est devenu plus complexe que déplacer 16 bits ou +.

    5) "Plus de fonctionnalités" != meilleures perfs
    Faut se calmer un peu avec ça... car c'est exactement la gué-guerre CISC/RISC...
    Donc ses présomptions sont pas bonnes non plus.

  17. #17
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Tient quelque chose de marrant...

    On retrouve les ~3.5sec annoncées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    \PokerEval-master\Release> .\pokereval.exe
    Time to evaluate 19981 poker hands: 3.73136
    \PokerEval-master\Release> .\pokereval.exe
    Time to evaluate 19981 poker hands: 3.72686
    Mais... Si on commente le Sleep(1); qui traine dans EvaluateHand(PokerHand& Ph)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    \PokerEval-master\Release> cp .\result.txt result_sleep.txt
    \PokerEval-master\Release> .\pokereval.exe
    Time to evaluate 19981 poker hands: 0.0709808
    \PokerEval-master\Release> .\pokereval.exe
    Time to evaluate 19981 poker hands: 0.0743642
    \PokerEval-master\Release> diff (cat .\result.txt) (cat .\result_sleep.txt) 
    \PokerEval-master\Release>
    => résultats identiques, j'ai pas creusé, mais le Sleep à l'air plus coupable que le langage...

    Conclusion : quelque soit le langage, si on attend au lieu de faire les calculs, c'est lent.

  18. #18
    Expert confirmé
    Avatar de TiranusKBX
    Homme Profil pro
    Développeur C, C++, C#, Python, PHP, HTML, JS, Laravel, Vue.js
    Inscrit en
    Avril 2013
    Messages
    1 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur C, C++, C#, Python, PHP, HTML, JS, Laravel, Vue.js
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 476
    Points : 4 806
    Points
    4 806
    Billets dans le blog
    6
    Par défaut
    en plus des commentaires des autres j'ajouterait que comparer un language optimisé pour windows avec un language générique fausse complètement la comparaison

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Au niveau des perfs de c# vs c++, dans la plupart des cas c++ est devant tant que le code est maîtrisé et bien optimisé (et oui on en revient toujours aux compétence du dev à la fin), mais quid du net native qu'elles sont ses perfs vs d'autre langage compilé.

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par TiranusKBX Voir le message
    en plus des commentaires des autres j'ajouterait que comparer un language optimisé pour windows avec un language générique fausse complètement la comparaison
    Le langage lui-même n'est pas optimisé pour telle ou telle plateforme ; il n'y a rien dans le langage C# qui soit spécifique à Windows. Après, le compilateur (et le JIT dans le cas de C#) va évidemment générer du code optimisé pour la plateforme cible, mais c'est vrai aussi bien pour C++ que pour C#.

    Au final, ce "benchmark" démontre surtout qu'on peut très bien écrire du code lent même avec un langage qui est intrinsèquement plus performant. Et aussi qu'il est plus difficile d'écrire du bon code C++ que du bon code C#...

Discussions similaires

  1. Quel est la méthode la plus rapide ?
    Par Invité dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2014, 20h20
  2. Quel est le parcours le plus rapide
    Par Atsibat dans le forum WinDev
    Réponses: 14
    Dernier message: 12/02/2013, 22h03
  3. [Firebird] Quel est le code le plus rapide ?
    Par ILP dans le forum Bases de données
    Réponses: 8
    Dernier message: 26/10/2009, 13h01
  4. Réponses: 2
    Dernier message: 27/01/2009, 19h01
  5. Réponses: 6
    Dernier message: 13/11/2007, 12h06

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