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

Langage C++ Discussion :

Fonctions de calcul et optimisation : namespace ou classe ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Fonctions de calcul et optimisation : namespace ou classe ?
    Bonjour.

    Dans le cadre de ma thèse je vais bientôt débuter l'implémentation d'un gros programme de calcul (c'est pour de la physique fondamentale et c'est destiné à fonctionner sur supercalculateur et/ou sur BOINC).

    Le tout sera bien entendu massivement multithreadé, et comme cela va être pratiquement "from ground", je vais essayé d'optimiser à mort toutes les fonctions de base qui vont être appelées des millions (milliards ?!?) de fois pendant l'exécution du programme...

    Tout ça pour en arriver à une question très simple : soit par exemple une fonction mathématique "mathfunc(double x)" qui sera appelée des millions de fois par des centaines de threads : faut-il mieux une implémentation de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace Math {
    double mathfunc(double x);
    }
    ou de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Math {
    public :
        static double mathfunc(double x);
    };
    1) Quelles sont les différences ?
    2) Y-a-t-il une implémentation préférable à l'autre ?
    3) L'implémentation par namespace est-elle plus rapide à l'exécution que l'implémentation par classe (il faut avoir conscience que la fonction sera appelée des millions de fois)?
    4) Un truc dont j'aimerai être certain : une fonction "static" dans une classe est commune à tout le programme ... mais cela ne pose-t-il pas problème lorsqu'elle est appelée simultanément par 2 threads ?
    5) Y-a-t-il une autre solution à laquelle je n'aurai pas pensé et qui serait préférable ?

    Merci beaucoup

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Kaluza Voir le message
    1) Quelles sont les différences ?
    Sur le code généré, à mon sens, non.
    Citation Envoyé par Kaluza Voir le message
    2) Y-a-t-il une implémentation préférable à l'autre ?
    Si la classe Math n'a pas vocation à être instanciée mais uniquement à regrouper des fonctions statiques alors autant utiliser un namespace.
    Citation Envoyé par Kaluza Voir le message
    3) L'implémentation par namespace est-elle plus rapide à l'exécution que l'implémentation par classe (il faut avoir conscience que la fonction sera appelée des millions de fois)?
    cf 1
    Citation Envoyé par Kaluza Voir le message
    4) Un truc dont j'aimerai être certain : une fonction "static" dans une classe est commune à tout le programme ... mais cela ne pose-t-il pas problème lorsqu'elle est appelée simultanément par 2 threads ?
    Si la fonction est pure, oui si les arguments ne posent pas de problème. Sinon, peut être pas.
    Citation Envoyé par Kaluza Voir le message
    5) Y-a-t-il une autre solution à laquelle je n'aurai pas pensé et qui serait préférable ?
    ?

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Kaluza Voir le message
    1) Quelles sont les différences ?
    Principalement conceptuelles. Au niveau de ce que le compilateur produit, il y aura peu voir pas de différence.

    Citation Envoyé par Kaluza Voir le message
    2) Y-a-t-il une implémentation préférable à l'autre ?
    Oui, la première. Je rejoins 3DArchi sur ce point: une classe n'a pas vocation a être un pseudo-nom d'espace. C++ offre des possibilité que Java ou C# n'offrent pas à ce niveau (c'est à dire que C++ permet de définir des fonctions libres, en dehors de toute classe), alors autant en profiter.

    Par contre, tu pourras peut-être te retrouver dans certains cas où une fonction pourra prendre une autre fonction en paramètre. Dans ce cas, l'utilisation de foncteur pourrait se révéler intéressante du point de vue des performances.

    Citation Envoyé par Kaluza Voir le message
    3) L'implémentation par namespace est-elle plus rapide à l'exécution que l'implémentation par classe (il faut avoir conscience que la fonction sera appelée des millions de fois)?
    Pourquoi le serait-elle ? Une fonction est une fonction, qu'elle soit membre statique d'une classe ou dans un namespace.

    Citation Envoyé par Kaluza Voir le message
    4) Un truc dont j'aimerai être certain : une fonction "static" dans une classe est commune à tout le programme ... mais cela ne pose-t-il pas problème lorsqu'elle est appelée simultanément par 2 threads ?
    Une fonction libre définie dans un namespace ou dans le namespace globale est dans le même cas : elle est commune à tout le programme pour peu qu'elle ait un linkage externe. A partir du moment où la fonction n'a pas d'effet de bords, elle est par définition réentrante et peut être appelée par plus d'un thread au même moment. Si elle modifie ses arguments, ou ne supporte pas que ses arguments soit modifiés lorsqu'elle est en cours de fonctionnement (par exemple : la fonction prends un pointeur en paramètre ; ce pointeur fait référence à une variable utilisée dans plusieurs thread, et à un moment donné, cette variable est modifiée par un autre thread), alors il faudra prévoir un mécanisme de synchronisation.

    Citation Envoyé par Kaluza Voir le message
    5) Y-a-t-il une autre solution à laquelle je n'aurai pas pensé et qui serait préférable ?
    Préférable, non. Mais il est possible d'envisager qu'une partie du travail soit fait par le compilateur, en utilisant des techniques de méta-programmation. Ce n'est pas nécessairement le sujet de ta thèse, donc tu peux certainement mettre ça de coté - d'autant plus que si tous tes calculs sont fait sur des valeurs que tu ne connais qu'au runtime, la méta-programmation ne va pas t'aider du tout.

    Pour les fonctions qui ne font pas partie de l'interface de la bibliothèque, n'oublie pas de les définir dans un namespace anonyme - ce qui leur donnera un linkage interne, et empêchera qu'elle ne soient rendues publiques par le linker.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut
    Merci beaucoup pour vos réponses.

    Au sujet de ma question 3), au niveau de la rapidité d'exécution, je me posais la question pour l'appel de la fonction (et non la fonction en elle-même) car je me disais que peut-être l'appel en passant par une classe était plus long qu'un appel passant par un namespace.

    Toutes les fonctions dont il était question ici étaient bien entendu des fonctions sans effet de bord...

    Au niveau de la métaprogrammation, je me suis lancé activement sur cette voie qui me semble plus qu'intéressante. En fait la partie qui m'intéresse le plus c'est celle sur les vecteurs dans le tuto de Laurent Gomilla.

Discussions similaires

  1. inversion de fonction de calcul
    Par jarko dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 16/12/2005, 18h31
  2. Réponses: 6
    Dernier message: 22/11/2005, 17h08
  3. Modifier un champs texte avec une fonction PHP (calcul TVA)
    Par Stella2809 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 00h55
  4. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  5. fonction qui calcule la factorielle ?
    Par piff62 dans le forum C
    Réponses: 8
    Dernier message: 27/02/2005, 11h00

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