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 tr�s actif
    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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 tr�s actif
    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
    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
    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 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
    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 : 51
    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
    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 �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    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 : 618
    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.

  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
    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