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 :

c# et calcul scientifique


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut c# et calcul scientifique
    Bonjour,

    le c# est -il assez suffisant en terme de performance pour le calcul scientifique ?
    J'ai peur que le machine virtuelle plombe les performances...

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    J'ai eu l'occasion de travailler dans le domaine financier à ma précédente job et je dois dire que la vitesse n'était pas vraiment le problème de .NET. Une fois le programme optimisé, les performances étaient similaires aux programmes C++ / Matlab. Le compilateur JIT fait une très bonne job.

    Cela étant dit, j'ai rencontré certaines difficultés lors qu'il s'agissait de simulations qui nécessitaient des tableaux de quelques millions de valeurs qui peut avoir comme fâcheuse conséquence de fragmenter ton heap et de lever des OutOfMemoryException.

  3. #3
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    Bonjour,

    le c# est -il assez suffisant en terme de performance pour le calcul scientifique ?
    J'ai peur que le machine virtuelle plombe les performances...

    Merci
    Il y a souvent incompréhension par rapport à cette notion de machine virtuelle mentionnée par Java (MS évite quant à lui l'utilisation de ce terme). Il n'y a pas de virtualisation ou autre et le pseudo-code sera compilé en natif (x86/x64). Le code asm généré est en pratique proche de celui d'un code écrit en C++ et les différences de performances généralement faibles ou très faibles.

    Pour du calcul scientifique, le seul et unique surpoids pertinent devrait être les vérifications des indices sur les tableaux. En C++ "montableau[i]" donne le code assembleur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Stocker la valeur de "montableau" (une séquence de valeurs) dans A
    Stocker la valeur de "i" dans B
    C = A + B
    Charger la valeur à l'adresse située dans C.
    En C#, en substance, tu as le code assembleur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Stocker la valeur de "montableau" (une longueur, suivie d'une séquence de valeurs) dans A
    Stocker la longueur de A (valeur située à l'adresse A) dans B
    Stocker la valeur de "i" dans C
    Si i >= longueur, sauter au label dépassement de capacité
    D = A + C + offset_début_séquence
    Charger la valeur à l'adresse située dans D.
    Note toutefois que ces vérifications de dépassement de capacité ne sont pas émises dans le code suivant car elles sont superflues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i = 0; i <= montableau.Length; i++)
    {
       montableau[i] = montableau[i] * 2;
    }
    Attention, il faut vraiment utiliser une boucle for telle qu'écrite ci-dessus pour que le compilo C# comprenne que les vérifications de capacité ne sont pas nécessaires. Il ne faut par exemple pas essayer de stocker la longueur dans une variable avant la boucle for, le compilateur ne reconnaîtrait pas ce motif comme sûr.

    Enfin, il est toujours possible d'utiliser des opérations unsafe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fixed(int* ptr = montableau)
    {
       int* p = ptr;
       for(int i = 0; i < 1000; i++) 
       {
           *p = *p + 1;
            p++;
       }
    }

    Quelques dernières remarques:
    * Si tu crains d'être limité par les accès mémoire plutôt que par la vitesse de traitement, sache que toute instance d'une classe dotnet a un en-tête de 10 octets. Les structures, quant à elles, n'ont pas ce genre de problèmes. Mais les méthodes dont un des paramètres est une structure ne sont jamais "inlined" par le compilateur.
    * Outre les vérifications de capacités, un surpoids important est la gestion automatisée de la mémoire : chaque allocation nécessite un référencement dans le ramasse-miettes ; chaque assignation/désassignation/fin de portée d'une variable nécessite une incrémentation/décrémentation du compteur de références ; le ramasse-miettes doit parfois interrompre ton code pour faire son boulot.
    * En plus des surpoids inhérents à dotnet et à la gestion automatisée de la mémoire, le compilateur C# est moins efficace que le compilateur C++. Pour du pur calcul, tu auras donc forcément une différence de performances. Toutefois, celle-ci n'a rien de gigantesque, à toi de voir selon tes besoins.
    * Enfin, sois conscient que même en C++, on utilise en pratique souvent des structures de données qui ajoutent au final les mêmes surpoids au code que ceux ajoutés par dotnet en standard.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    J'ajouterais que .Net mets a ta disposition des bibliothèques de parallèlisation (PLINQ) qui simplifient le développement multithreadé

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    * Outre les vérifications de capacités, un surpoids important est la gestion automatisée de la mémoire : chaque allocation nécessite un référencement dans le ramasse-miettes ; chaque assignation/désassignation/fin de portée d'une variable nécessite une incrémentation/décrémentation du compteur de références ; le ramasse-miettes doit parfois interrompre ton code pour faire son boulot.
    C'est un des cas, où un appel manuel au GC avant le traitement peut être (parfois) rentable. L'idée dans ce cas est de dire que si il est appelé avant, on diminue les chances qu'il soit appelé pendant.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/11/2009, 11h12
  2. Technique adéquate pour du calcul scientifique
    Par delire8 dans le forum API graphiques
    Réponses: 3
    Dernier message: 10/12/2008, 15h45
  3. calcul scientifique & compilateur
    Par kw1k dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 12/06/2006, 10h09

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