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 :

Tableau déchiqueté & performances


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Tableau déchiqueté & performances
    Hello,

    Pour l'implémentation d'un tableau déchiqueté, l'utilisation de vecteurs de vecteurs, plutôt qu'une tambouille à base de tableaux de pointeurs, représente--t-elle une baisse significative de performances ?

    Seules les performances en lecture m'intéressent. Le remplissage est déterministe, et n'induira pas de problème de réallocation.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Je pense que la meilleure solution reste encore de tester

    Après, "baisse significative de performances" dépend surtout de ce que ton programme fera et du nombre de données qu'il manipulera.

    Si tu t'amuses à lire des fichiers tout en ayant une interface graphique 3D et que tu ne manipules que 4 valeurs, prendre un tableau de pointeurs ou un vecteur de vecteur ne fera pas grande différence.

    Par contre si ton programme ne fait que lire les données de ton vecteur de vecteur ou de ton tableau de pointeur et que tu as un nombre important de valeurs à traiter alors oui, peut-être que cela pourra jouer.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pour l'instant, il y a un tableau de pointeurs qui m'emmènent quelque part sur un même tableau d'octets. L'élément pointé me donne le nombre d'éléments auquel je dois m'attendre, puis j'itère sur les octets suivants (modulo une taille de classe : c'est de la désérialisation) avec un passage par un reinterpret_cast().

    J'ai plutôt envie, à la lecture, de transformer tout ça en un vecteur de vecteurs.

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    un vecteur de vecteur n'est pas contigu et va pourrir ton cache

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Sinon, c'est un peu tiré par les cheveux, mais ne pourrait-on pas stocker toutes les données dans un seul vecteur "data" comme tu le fait avec ta méthode de tableau de pointeur puis créer un vector de Ligne contenant des Lignes.

    Une Ligne hériterait alors de vector et redéfinierait les méthodes de sorte qu'il aille rechercher les données dans le vecteur "data" à chaque demandes (DP Proxy je ne m'abuse).

    Ainsi tu ne devrais pas trop perdre en performances et tu aura un conteneur "STL".

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Une Ligne hériterait alors de vector et redéfinierait les méthodes de sorte qu'il aille rechercher les données dans le vecteur "data" à chaque demandes (DP Proxy je ne m'abuse).
    L'héritage et les conteneurs STL, ça va très mal ensemble, les destructeurs ne sont pas virtuels.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Un seul vecteur résout complètement le problème sans perte de performance!

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    L'héritage et les conteneurs STL, ça va très mal ensemble, les destructeurs ne sont pas virtuels.
    J'avais oublié

    Il n'y a peut être pas besoin d'héritage alors, je sais que les itérateurs doivent hériter de pas mal de choses ( mais il suffit d'utiliser ceux du vecteur "data"), mais pour les conteneurs je ne suis pas sûr que ce soit le cas.

  9. #9
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    L'héritage et les conteneurs STL, ça va très mal ensemble, les destructeurs ne sont pas virtuels.
    ... ce qui n'empêche pas d'utiliser l'héritage privé, de rendre publiques les méthodes de std::vector que l'on souhaite exposer, et d'implémenter sois-même celles qui ont un comportement différent de la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    template<typename T>
    class Ligne : private std::vector<T> {
        using base = std::vector<T>;
     
    public :
        using base::iterator;
        using base::const_iterator;
        using base::reverse_iterator;
        using base::const_reverse_iterator;
     
        using base::begin;
        using base::end;
        using base::rbegin;
        using base::rend;
     
        // ...
     
        T& operator [] (std::size_t i) { ... }
        const T& operator [] (std::size_t i) const { ... }
    }

  10. #10
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Kalith Voir le message
    ... ce qui n'empêche pas d'utiliser l'héritage privé
    ok, je connaissais pas ça, ça peut être utile dans pas mal de cas, merci =)

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    L'héritage et les conteneurs STL, ça va très mal ensemble, les destructeurs ne sont pas virtuels.
    Ce qui ne dérange que si tu comptes utiliser ton container avec du polymorphisme
    Ecrire class MyVector : public std::vector ne gène en rien tant que tu ne manipules par MyVector comme étant un std::vector, mais uniquement des MyVector
    Ca revient plus ou moins à se limiter à l'héritage private dans son utilisation, moyennant un minimum d'attention du programmeur.
    C'est pas forcément du plus propre, mais quel gain de temps on peut gagner
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bonjour,

    Ce que vous proposez est intéressant, mais je n'ai malheureusement pas le temps pour l'implémenter.

    Je vais donc en rester à l'existant pour éviter les problèmes de manque de localité des données.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    En fait, comme je compte mettre mes vecteurs en mémoire partagée, où la mémoire allouable est contrainte dans un espace réduit, je ne devrais finalement pas être confronté au problème de la localité des données.

  14. #14
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Attention, pas de pointeurs dans la mémoire partagée.
    (des pointeurs vers elle, ok, mais pas dedans)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Boost.Interprocess offre un pointeur intelligent basé sur un offset pour gérer l'utilisation des pointeurs.

  16. #16
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par leternel Voir le message
    Attention, pas de pointeurs dans la mémoire partagée.
    (des pointeurs vers elle, ok, mais pas dedans)
    Si des pointeurs dans la mémoire partagée pointent vers une zone de cette même mémoire partagée est-ce qu'il y a vraiment un problème ?
    Je pense que non mais je commence à avoir un doute

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je débute dans le domaine, mais d'après ce que j'ai cru comprendre, il n'y a pas moyen de travailler avec des pointeurs, quelle que soit leur forme, entre deux zones mémoire.

    Si c'est au sein de la même zone mémoire, il faut utiliser un pointeur spécial, sauf si c'est un seul et unique processus qui travaille avec ces pointeurs.

  18. #18
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    les mémoires partagées sont "mappés" vers des blocs de mémoires internes à chaque processus.
    ainsi, la "shared adress 17" peut être à l'adresse 134 pour process1 et 812 pour process2;

    &"shared adress 17" = 134 dans process1 et &"shared adress 17" = 812 dans process2

    dans process1, stoquer l'adresse 134 dans un pointeur partagé ne le traduit pas pour process2.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Si des pointeurs dans la mémoire partagée pointent vers une zone de cette même mémoire partagée est-ce qu'il y a vraiment un problème ?
    Je pense que non mais je commence à avoir un doute
    Pas possible. La zone mémoire peut être mappée à deux adresses différentes (0x7000a000 et 0x7000b000 par exemple) dans deux process différents. Du coup, un pointeur 0x7000a110 dans la zone de mémoire partagée ne pourra pas être utilisée dans la seconde.

    offset_ptr<> dans boost.interprocess stocke l'offset entre l'objet offset_ptr<> et la cible - donc, dans le cas des deux exemple, si (p = this = 0x700a100 = 0x10), offset. Le déréférencement de offset_ptr<> effectue l'opération inverse. Sur la seconde zone, (p = this = 0x7000b100, donc *p = (0x7000b100+offset) = 0x7000b110.

    Il y a des petites astuces sur la copie, le move... pour que l'offset reste toujours valide quelque soit l'instance de offset_ptr<> considérée.

    C'est la seule manière de procéder (manière à laquelle je n'avais pas pensé, d'ailleurs).
    [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.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/07/2010, 23h35
  2. Réponses: 2
    Dernier message: 23/08/2007, 12h22
  3. Réponses: 3
    Dernier message: 25/04/2007, 09h45
  4. Réponses: 1
    Dernier message: 02/04/2007, 15h26
  5. [C#] Performance : c'est mieux un tableau ou un ArrayList?
    Par trotters213 dans le forum Windows Forms
    Réponses: 14
    Dernier message: 31/03/2005, 11h59

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