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

C# Discussion :

Rapidité en c# Optimisation


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 915
    Points : 85
    Points
    85
    Par défaut Rapidité en c# Optimisation
    Bonjour,

    Une question : Un programme écrite en C sera t'il plus rapide qu'un programme à fonctionnement identique écrite en C# ??
    Autre question :
    Si il y a des lenteurs en C# , que faut t'il faire ?

    Autre question :
    L'usage du link comme Where,FindIndex est t'il plus rapide que de ne pas l'utiliser ?

    Merci.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    fondamentalement C# est moins rapide que C C++ et autres
    le code C# est compilé en CIL dans l'exe et est recompilé à la volée sur la machine finale lors de l'exécution ce qui est déjà une légère perte de temps à chaque 1er accès à un bout de code
    après C# est un langage managé qui gère la mémoire pour le développeur, là aussi ca doit induire un peu de perte
    depuis quelques années nous avons .NET Core qui est un reboot de .NET avec plus de performances, et des optimisations aussi sur la compilation finale (1ère compilation pas optimisée puis si le code est souvent utilisé une recompilation plus performante)

    linq il n'y a pas d'utilité à ne pas l'utiliser, c'est comme tout, bien utilisé il ne coute rien et apporte un gain en temps de développement

    après un mauvais code en C sera toujours plus lent qu'un bon code en C#
    et le besoin de performance dépend de ce qu'on veut faire et de la puissance de la machine sur laquelle ca va se trouver, pour une appli métier avec interface C# suffit amplement
    et comme sur chaque langage, le fait de comprendre les rouages et de connaitre le framework permet d'utiliser les meilleurs choses de la meilleure manière (par exemple il y a plein de types de collections (tableaux en mieux) certaines performantes pour de l'accès séquentiel, d'autres pour de la recherche, d'autres pour de l'accès contigu, de l'accès concurrent etc...)

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Quelques petits ajouts :
    - Un programme C# sera plus lent qu'un programme C correctement codé (et optimisé) sous certaine conditions.
    => En effet, en C# il y a plus de couches, le GC, etc.
    => En revanche, si le programme C gère la mémoire à la sauce "j'alloue et on finira bien par retrouver la mémoire quand le programme s'arrêtera", alors le C# peut rapidement devenir plus rapide en conservant une empreinte mémoire plus faible.
    => Aussi, un simple Sort() ne se comportera pas de la même manière en C# si la collection fait 3 éléments ou 3 millions. En C, si. Ainsi, le C# peut tirer son épingle du jeu sur ce genre de traitements si le développeur C n'a pas choisi les algos les plus performants en fonction de la volumétrie traitée
    => Idem pour les instructions CPU. Si GCC a produit un code qui utilise x86 et SEE mais pas 3DNow, alors si le programme tourne sur un CPU supportant 3DNow il n'exploitera pas ces fonctions. En revanche, en .NET le Framework va tenter de tirer profit des spécificités matérielles sur lequel il tourne. Aujourd'hui c'est moins vrai car presque tous les CPU supportent presque toutes les instructions, ma à une époque selon si on avait un Intel ou un AMD, d'une génération à une autre, on pouvait avoir des performances très différentes...
    => Enfin, les facilités apportées par le C# permettent de mettre en place des mécanismes complexes à manipuler en C qui peuvent améliorer drastiquement les performances (multithreading par exemple) mais aussi l'inverse (notamment avec Linq)

    En ce qui concerne Linq justement...
    En C, quand t'as une matrice qui contient des lignes de commandes, et que tu souhaites imprimer la quantité totale et le montant total de la commande, tu boucles dessus, et tu incrémentes dans la même boucle la quantité totale et le montant total.
    En C#, avec l'apparition de Linq, on trouve de plus en plus de programmes qui font :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int qty_total = MesLignes.Sum(a => a.Qty);
    decimal price_total = MesLignes.Sum(a => a.Qty * a.Price);

    Et là on a l'impression d'avoir un truc rapide (car simple à écrire)... sauf qu'il est juste deux fois plus lent puisqu'on boucle deux fois !

    Bref, Linq c'est super tip top, mais il faut pas en abuser, car ça peut vite devenir une usine à gaz (sans oublier la maintenance derrière qui n'est pas toujours évidente, car une syntaxe parfois déroutante, avec des génération de types intermédiaires à la volée grace -ou à cause de- var ,etc.).

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Aussi, un simple Sort() ne se comportera pas de la même manière en C# si la collection fait 3 éléments ou 3 millions. En C, si. Ainsi, le C# peut tirer son épingle du jeu sur ce genre de traitements si le développeur C n'a pas choisi les algos les plus performants en fonction de la volumétrie traitée
    ah ?

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    ah ?
    Oui

    Par contre, au vue de ce topic :
    https://stackoverflow.com/questions/...work-implement

    Soit il y a des erreurs dans la MSDN, soit ça a évolué, soit... Donc au choix, soit 1, 2 ou 3 algo différents selon la taille du tableau.

    Edit : avec .NET Core 3.1, on a bien trois algo en fonction de la taille de la liste.
    https://docs.microsoft.com/fr-fr/dot...ons_IComparer_

    Cette méthode utilise l’algorithme de tri Introsort, comme suit :
    • Si la taille de la partition est inférieure ou égale à 16 éléments, elle utilise un algorithme de tri d’insertion .
    • Si le nombre de partitions dépasse 2 * logN, où n est la plage du tableau d’entrée, il utilise un algorithme HeapSort .
    • Dans le cas contraire, il utilise un algorithme tri rapide*.
    * : traduction merdique... On parle de QuickSort évidement

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2018
    Messages : 59
    Points : 540
    Points
    540
    Par défaut
    Salut,

    Pour repondre/revenir à la question initiale de yann458 .

    - Oui d'un point de vue général un programme en C correctement effectué sera plus rapide qu'un programme en C# tout aussi correctement effectué .
    - Encore faut il réussir à faire le même programme en C... Parce que on n'a clairement pas les même facilités dans le cas du C ou du C++ que on a en C#.
    - Et une fois qu'on a fait le programme en C... on passe a l'assembleur parce que c'est toujours pas assez rapide ?...
    - J'ai réussi dans le passé a diviser par x la vitesse de programmes correctement effectué en changeant simplement la philosophie des programmes pour ne pas avoir a
    calculer des choses trop grosses, si on change notre manière de penser on peut souvent changer bien des choses en partant d'un autre point de vue innovant.

    Donc il faudrait en savoir un peut plus sur tes programmes yan458.
    - Qu'est ce qui est lent ? Peut on éviter ces calculs, les optimiser , en diminuer le nombre ...
    - Est ce que tu travaille avec une base de donnée, et dans ce cas n'est ce pas plutôt la base a optimiser?
    Par exemple pour trier beaucoup de valeur il vaut mieux les mettre dans une base de donnée et faire une requête SQL. Mais beaucoup c'est combien 1 million?
    - Est ce que ce n'est finalement pas si anormale que ca soit lent ( le calcul des nombre premier c'est tres lent et c'est normal... ) ?
    - Tu est a combien en dessous de ton objectif 10% en dessous, 50 %, tu veut aller 10X plus vite ? il faut qu'on sache.


    Il est difficile de t'aider tant que l'on n'en sait pas plus.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 915
    Points : 85
    Points
    85
    Par défaut
    J'ai porter dans mon projet dotnet des portion de code vers le C ,
    et c'est plus rapide.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    merci pour cette information claire et détaillée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [optimisation] En terme de rapidité
    Par Deallyra dans le forum SQL
    Réponses: 16
    Dernier message: 24/01/2009, 13h12
  2. optimisation question de rapidité (<> vs not)
    Par Just-Soft dans le forum Langage
    Réponses: 5
    Dernier message: 20/11/2008, 11h51
  3. Optimiser rapidité code
    Par bobosh dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/08/2008, 16h12
  4. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  5. Optimisation de mémoire / rapiditée
    Par Zenol dans le forum C++
    Réponses: 9
    Dernier message: 25/09/2005, 11h18

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