Meilleur auteur de réponses
calculs scientifiques avec c#

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
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.
-
-
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
-
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
-
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....
-
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
-
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+
-
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
-
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"
-
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 ...
-
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
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.
-
-
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
-
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
-
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....
-
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
-
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+
-
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
-
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"
-
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 ...
-
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
-
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
-
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