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 :

Besoin d'une lookup table rapide


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut Besoin d'une lookup table rapide
    Bonsoir, je cherche en C++ une lib offrant table d'association rapide avec en clé une std::string et en valeur un pointeur (sous gcc 4.5)

    C'est une application graphique qui tourne en 60 frames/sec
    Je dois faire un lookup sur une table de 10000 entrées environ et 10000 appels
    par frame

    j'étais parti sur std::unordered_map mais elle n'a pas l'air d'être très efficace sur les string même avec 01 ou 02 activés (enfin comparé à une clé en int)

    Faut il que je m'oriente vers une solution "à la main" ?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le fait est que tu n'auras JAMAISde bonnes perfs en utilisant une chaine de caractères comme clé.

    La raison est tout simplement la méthode de comparaison de celles-ci : il faut comparer caractères par caractères jusqu'à trouver (ou non) une différence, et cela implique une boucle !

    Une valeur strictement numérique, qui soit comparable "en une seule fois" donnera forcément des performances bien meilleures
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    screetch
    Invité(e)
    Par défaut
    en même temps c'est bien pour ca qu'on a inventé le hash qui permet de ne pas comparer les chaînes trop souvent
    a mon avis le problème que tu as c'est qu'avec tes std::string tu fais des allocations en permanence. Mais c'est juste une devinette, parce que en fait les vrais programmeurs utilisent un profiler de code pour savoir ce qui coûte cher. Ils disent pas au pif comme moi :o)

  4. #4
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Le fait est que tu n'auras JAMAISde bonnes perfs en utilisant une chaine de caractères comme clé.

    La raison est tout simplement la méthode de comparaison de celles-ci : il faut comparer caractères par caractères jusqu'à trouver (ou non) une différence, et cela implique une boucle !

    Une valeur strictement numérique, qui soit comparable "en une seule fois" donnera forcément des performances bien meilleures
    C'est bien ce que je pensais, il me fallait juste confirmation

    Par contre y a t il moyen de faire mieux que la STL si on se cantonne au couple int/pointeur

  5. #5
    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 coda_blank Voir le message
    C'est bien ce que je pensais, il me fallait juste confirmation

    Par contre y a t il moyen de faire mieux que la STL si on se cantonne au couple int/pointeur
    Mieux que quoi dans la STL ? Si tu parles de std::map<>, oui, il y a mieux. Dans le TR1, on a unordered_set/unordered_multiset qui sont grosso-modo des tables de hash. Avec une fonction de hashage optimale, chercher un élément dans ces ensembles est une opération de complexité constante (indépendante du nombre d'éléments insérés).
    [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.

  6. #6
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Cela dit il a déjà tenté unordered_map, comme dit dans le premier post.

    Le problème est fondamentalement difficile de toutes façons, juste changer de conteneur ça ne suffira jamais.

    Si les données sont indépendantes, peut être qu'en organisant ton traitement en parallèle ça aidera? Ca dépends si tu as plusieurs coeurs d'execution sur ta cible cela dit.

    Pour faire mieu niveau perfs, il faut voir plus haut, donc savoir plus de choses sur ce qui est traité comme données et le contexte.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    La table de hash est plus performante en complexité, mais pas forcément en pratique. J'ai eu des retours où std::map explosait std::unordered_map tant que les jeux de donnée n'explosaient pas le million. Un des problèmes avec une table de hash est le choix de la fonction de hash. La tienne est-elle bonne par rapport aux strings que tu manipules ? As-tu beaucoup de collisions ?


    Est-ce que tu as souvent besoin d'accéder aux mêmes éléments ? Si oui, un splay tree pourrait être intéressant.

    10000 entrées et 10000 appels par frame, pourquoi le même nombre ? Ne peux-tu pas réorganiser ton algorithme pour faire moins d'appels ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Si ta clef est un int qui n'est jamais trop grand (genre < 10000), tu peux essayer un bête std::vector de taille MAX_KEY. Niveau conso mémoire, tu aura un rendement proche du néant avec beaucoup de cases inutiles, mais niveau perf tu accédera à tes éléments en temps constant... Parfois, c'est un compromis acceptable.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  9. #9
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    En fait un vector ou un array c'est ce que j'ai pensé en premier mais je me dis que c'est le "cas idéal" et du coup si ya moyen de paralléliser ça pourrait être encore plus rapide.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/11/2012, 13h51
  2. besoin d'une table de liaison ?
    Par noobcestmoi dans le forum Modélisation
    Réponses: 6
    Dernier message: 19/04/2010, 17h05
  3. Réponses: 12
    Dernier message: 09/11/2009, 19h56
  4. Besoin d'infos sur fonction utilisant des lookup table
    Par Phelix2003 dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 24/10/2008, 11h07
  5. [Table liée] Besoin d'une clé
    Par Odulo dans le forum Access
    Réponses: 4
    Dernier message: 22/09/2005, 09h50

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