none
calculs scientifiques avec c# RRS feed

  • Question

  • J'ai pas mal buché des ouvrages sur Visual C# 2005 et souvent, je me suis aperçu que ce langage était surtout orienté "chaînes de caractères" avec tous leurs attirails (recherche, tri, base de données, documents, formulaires simples des 4 opérations de base.....).

    Je n'ai pas trouvé d'exemples de soubroutines de calculs scientifiques avec ce langage. Pourtant, dans ma jeunesse, j'avais écrit des programmes scientifiques performants en Basic et Visual Basic.

    Puis-je espérer que des soubroutines écrites en C# puissent être performantes et rapides ? ou devrais-je aller vers le fortran ?

     

    Merci pour votre réponse  

     

     

    alfred

    jeudi 21 juin 2007 12:21

Réponses

  • Je n'ai jamais fait de Fortran ni même de tests en C# au niveau des performances en terme rapidité/performance mais il faut savoir que le C# est compilé puis exécuter en temps réel (Just In Time) donc il est fort possible qu'il soit moins rapide que certains autres langages.
    jeudi 21 juin 2007 21:55
  • Je suis du même avis que Thomas.

     

    Je vous recommanderais cependant de vous pencher sur C++ .NET qui permet de manipuler du code managé/non managé et ainsi dans le cas du non managé de meilleurs performances à l'execution...

     

    Cordialement

    vendredi 22 juin 2007 12:46
    Modérateur
  • D'abord, merci pour votre réponse...

     

    Je me suis orienté vers c# car j'avais écrit mes programmes en DELPHI et c# s'y apparentait (avec les avantages des nouveaux controles et de la convivialité) mieux que c++/cli et surtout plus simple à l'emploi; je suis un débutant en C,C++.....

    Question rapidité, qu'appelez-vous plus rapide ? est-ce 10%, 20% ou 100 à 300% ?

    Si c'est 10 à 20%, il n'y a pas photo, je reste en C#.

    Il n'y a qu'une fonction critique dans chacun de mes programmes (résolution d'équations différentielles (1 à 100) par métode Runge Kutta ou autre calcul).

    Si cette fonction est en "unsafe" en C#, pourra-t'elle rivaliser avec une "unmanaged" en C++/cli. De combien sera-t'elle moins rapide ? 10, 20, 100 ou 300% ?

     

    J'espère que j'ai été assez clair ...

     

    Comment faire pour m'inscrire aux mercredis de microsoft, rue de l'université, afin d'y glaner des infos.

      

    merci pour votre réponse..

     

    Alfred

     

    lundi 25 juin 2007 08:13
  • Je ne peux pas vous énoncer des chiffres sur la performance car cela se mesure et dépend de plusieurs facteurs...

    Cependant le non-managé est beaucoup plus rapide dans le sens où il n'existe pas une couche intermédiaire (.NET Framework) qui réalise diverses contrôle (comme le contrôle des types, dépassement de capacité, vérification de l'intégrité des assembly,...etc).

    Vous pouvez cependant dans votre cas implémenter votre fonction mathématique critique en performance en C++/CLI et le reste en C#.

     

    Pour vous donner un exemple retoucher une photo en C# (Parcourir un tableau de byte, opération simples sur des nombres, ...etc), via du code managé est très lent ! On passe toujours par une bibliothèque non-managée...

     

    Personnellement (mais cela est discutable), le code non-managé est grosso modo 1,5 à 2 fois plus rapide que le code managé.

     

    Le méthode "unsafe" permettent juste de faire de la bidouille au niveau des pointeurs mais ne désactive en aucun cas les sécurités du Framework...

     

    Cordialement

    lundi 25 juin 2007 08:29
    Modérateur
  • Je suis du même avis que Gilles: Si vous souhaitez de la performance, utilise C++/CLI.

     

    En effet, unsafe vous fera sans doute gagner en performance car vous accéderez directement aux pointeurs de vos données mais, même si je reconnais ne pas avoir fait de benchmark, cela risque d'être moins performant....

     

    Bref, le mieux  pour être sur, est sans doute de faire quelques tests....

    lundi 25 juin 2007 09:30
  • Merci beaucoup pour vos réponses rapides et explicites.

    Comment inclure une fonction en c++/cli non managée dans un programme en c# ? Doit-on écrire la fonction dans une DLL ou peut-elle etre importée autrement ? Avez-vous un exemple sur un cas tres tres simple ? Par exemple executer la fonction (c++/cli non managée) après click sur un bouton d'une winform en c#. Ou existe-t'il un bouquin donnant un exemple equivallent ?

     

    Merci d'avance,

     

    Alfred 

    lundi 25 juin 2007 11:27
  • Je ne maitrise en aucun cas le développement C++/CLI mais le mieux est sans doute de faire une DLL contenant votre code C++/CLI.

     

    Ensuite, vous utilisez le P/Invoke pour accéder à vos méthodes: http://morpheus.developpez.com/dlldotnet

     

     

    A+

    lundi 25 juin 2007 11:51
  • Bonjour,

    L'interet de C++/CLI c'est d'éviter l'utilisation du p/invoke

    Voir http://www.techheadbrothers.com/Articles.aspx?Id=c7d58966-f33e-4fc2-aa4d-452979a97888

     

    Rémi

    mardi 26 juin 2007 07:27
  •  Remi Thomas A écrit:

    Bonjour,

    L'interet de C++/CLI c'est d'éviter l'utilisation du p/invoke

     

    Effectivement, on ne fait qu'appeler du .NET (C++) dans une application .NET (C# / VB): je devrais faire attention à ce que je dis.....

     

    Néanmoins, l'intérê du P/Invoke reste valable si vous désirez développer votre DLL en C++ "natif"

    mardi 26 juin 2007 07:39
  • Bonjour,

     

    Il est clair que la syntaxe C# est loin d'être optimale pour ce type de problématique...

    Vous pouvez regarder du coté de F# qui est la syntaxe du language fonctionnel OCaml. Voir : http://research.microsoft.com/fsharp/fsharp.aspx. Peut cela vous sera utile ...

     

     

    mardi 26 juin 2007 17:48
  • Bonjour,

     

    Pas besoin de fichier. Dans le wrapper tu as accès aux deux mondes (managé et natif). Donc une simple boucle qui fait une copie fonctionne très bien. Si des types qui n'existent pas dans le monde .NET sont manipulés, le compilateur fera le casting.

     

    Rémi

    jeudi 28 juin 2007 14:22

Toutes les réponses

  • Je n'ai jamais fait de Fortran ni même de tests en C# au niveau des performances en terme rapidité/performance mais il faut savoir que le C# est compilé puis exécuter en temps réel (Just In Time) donc il est fort possible qu'il soit moins rapide que certains autres langages.
    jeudi 21 juin 2007 21:55
  • Je suis du même avis que Thomas.

     

    Je vous recommanderais cependant de vous pencher sur C++ .NET qui permet de manipuler du code managé/non managé et ainsi dans le cas du non managé de meilleurs performances à l'execution...

     

    Cordialement

    vendredi 22 juin 2007 12:46
    Modérateur
  • D'abord, merci pour votre réponse...

     

    Je me suis orienté vers c# car j'avais écrit mes programmes en DELPHI et c# s'y apparentait (avec les avantages des nouveaux controles et de la convivialité) mieux que c++/cli et surtout plus simple à l'emploi; je suis un débutant en C,C++.....

    Question rapidité, qu'appelez-vous plus rapide ? est-ce 10%, 20% ou 100 à 300% ?

    Si c'est 10 à 20%, il n'y a pas photo, je reste en C#.

    Il n'y a qu'une fonction critique dans chacun de mes programmes (résolution d'équations différentielles (1 à 100) par métode Runge Kutta ou autre calcul).

    Si cette fonction est en "unsafe" en C#, pourra-t'elle rivaliser avec une "unmanaged" en C++/cli. De combien sera-t'elle moins rapide ? 10, 20, 100 ou 300% ?

     

    J'espère que j'ai été assez clair ...

     

    Comment faire pour m'inscrire aux mercredis de microsoft, rue de l'université, afin d'y glaner des infos.

      

    merci pour votre réponse..

     

    Alfred

     

    lundi 25 juin 2007 08:13
  • Je ne peux pas vous énoncer des chiffres sur la performance car cela se mesure et dépend de plusieurs facteurs...

    Cependant le non-managé est beaucoup plus rapide dans le sens où il n'existe pas une couche intermédiaire (.NET Framework) qui réalise diverses contrôle (comme le contrôle des types, dépassement de capacité, vérification de l'intégrité des assembly,...etc).

    Vous pouvez cependant dans votre cas implémenter votre fonction mathématique critique en performance en C++/CLI et le reste en C#.

     

    Pour vous donner un exemple retoucher une photo en C# (Parcourir un tableau de byte, opération simples sur des nombres, ...etc), via du code managé est très lent ! On passe toujours par une bibliothèque non-managée...

     

    Personnellement (mais cela est discutable), le code non-managé est grosso modo 1,5 à 2 fois plus rapide que le code managé.

     

    Le méthode "unsafe" permettent juste de faire de la bidouille au niveau des pointeurs mais ne désactive en aucun cas les sécurités du Framework...

     

    Cordialement

    lundi 25 juin 2007 08:29
    Modérateur
  • Je suis du même avis que Gilles: Si vous souhaitez de la performance, utilise C++/CLI.

     

    En effet, unsafe vous fera sans doute gagner en performance car vous accéderez directement aux pointeurs de vos données mais, même si je reconnais ne pas avoir fait de benchmark, cela risque d'être moins performant....

     

    Bref, le mieux  pour être sur, est sans doute de faire quelques tests....

    lundi 25 juin 2007 09:30
  • Merci beaucoup pour vos réponses rapides et explicites.

    Comment inclure une fonction en c++/cli non managée dans un programme en c# ? Doit-on écrire la fonction dans une DLL ou peut-elle etre importée autrement ? Avez-vous un exemple sur un cas tres tres simple ? Par exemple executer la fonction (c++/cli non managée) après click sur un bouton d'une winform en c#. Ou existe-t'il un bouquin donnant un exemple equivallent ?

     

    Merci d'avance,

     

    Alfred 

    lundi 25 juin 2007 11:27
  • Je ne maitrise en aucun cas le développement C++/CLI mais le mieux est sans doute de faire une DLL contenant votre code C++/CLI.

     

    Ensuite, vous utilisez le P/Invoke pour accéder à vos méthodes: http://morpheus.developpez.com/dlldotnet

     

     

    A+

    lundi 25 juin 2007 11:51
  • Bonjour,

    L'interet de C++/CLI c'est d'éviter l'utilisation du p/invoke

    Voir http://www.techheadbrothers.com/Articles.aspx?Id=c7d58966-f33e-4fc2-aa4d-452979a97888

     

    Rémi

    mardi 26 juin 2007 07:27
  •  Remi Thomas A écrit:

    Bonjour,

    L'interet de C++/CLI c'est d'éviter l'utilisation du p/invoke

     

    Effectivement, on ne fait qu'appeler du .NET (C++) dans une application .NET (C# / VB): je devrais faire attention à ce que je dis.....

     

    Néanmoins, l'intérê du P/Invoke reste valable si vous désirez développer votre DLL en C++ "natif"

    mardi 26 juin 2007 07:39
  • Bonjour,

     

    Il est clair que la syntaxe C# est loin d'être optimale pour ce type de problématique...

    Vous pouvez regarder du coté de F# qui est la syntaxe du language fonctionnel OCaml. Voir : http://research.microsoft.com/fsharp/fsharp.aspx. Peut cela vous sera utile ...

     

     

    mardi 26 juin 2007 17:48
  • Je vous remercie, Remi, pour votre exemple.

    J'aurais une question basique:

    Je peux utiliser votre exemple dans mon programme (associer le natif C++ à mon programme en C# comme vous le faites avec le même canevas) et mettre ma fonction écrite en C++ dans la fonction Cdemo::moyenne (qui pourrait englober d'autres fonctions en C++ aussi). 

    Ma fonction reçoit un ou des tableaux en argument et en sortie on récupère un ou des tableaux de valeurs calculées dans ladite fonction. Pour récupérer ces valeurs résultats doit-on passer par un fichier (la fonction écrit les valeurs résultats dans un fichier texte par exemple, et le programme en C# lit les valeurs de ce fichier) ?

    ou, sinon, la fonction peut-elle renvoyer un tableau (des résultats) au C# ?

     

    J'espère que j'ai était clair.

     

    Bien cordialement,

     

    Alfred,

     

    Question: pour récupérer les valeurs résultats, doit-on  le tableau (test) que vous avez mis en argument dans la fonction dans program.cs peut-il etre modifié dans "demo" et récupéré dans  ("le Si j'utilise des pointeurs je devrais les créer 

    jeudi 28 juin 2007 09:59
  • Bonjour,

     

    Pas besoin de fichier. Dans le wrapper tu as accès aux deux mondes (managé et natif). Donc une simple boucle qui fait une copie fonctionne très bien. Si des types qui n'existent pas dans le monde .NET sont manipulés, le compilateur fera le casting.

     

    Rémi

    jeudi 28 juin 2007 14:22
  • Merci, merci beaucoup, Rémi......

     

    Une dernière question.....

     

    Où pourrais-je trouver (livres, sites.....) des exemples comme celui que tu as aimablement publié (demo....) qui seraient un peu plus détaillés pour que je comprenne bien la philosophie du wrapper qui a l'air de bien me convenir dans mes programmes.

     

    Merci d'avance,

     

    Alfred

    vendredi 29 juin 2007 09:58