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 :

Performance des Dictionnaires


Sujet :

C#

  1. #1
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut Performance des Dictionnaires
    Bonsoir,

    Je suis actuellement confronté à un problème pour mon jeu.
    Le World est donc composé de Continents, qui sont composé de Regions, ect..
    Voila donc la structure grossière.

    World -> Continents -> Régions -> Zones -> Maps.

    Après viennent s'ajouter les personnages ( et les problèmes aussi ).

    1. Dois-je mettre un seul Dictionnaire de Personnage pour le World. Pour récupérer les personnages présent sur une Map, je devrai donc faire une recherche dans le dictionnaire du World.

    2. Ou dois-je avoir un dictionaire pour chaque Map, Zones, Regions, Continents et pour le World. Cela me permettrai d'avoir un accès direct aux personnages présents sur la carte ( ce qui est souvent utilisé, pour les déplacements, t'chat.. ), bien que chaque changement de carte entrainerai des ajouts/suppression conséquentes dans les dictionnaires.

    En sachant que l'application est mulithreadé et donc, qu'a chaque accès aux dictionnaires, on a un lock.

    Merci d'avance

  2. #2
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Un dictionnaire .net pourrait rencontrer des problèmes de performance au-delà de 5 millions d'éléments, selon ce message à Stackoverflow.com, parce qu'il devra se mettre à chercher des nouveaux nombres premiers.

    Cela dit, à moins que vous ayiez réellement un si grand nombre de personnages, votre problème de performance majeur ici est d'avoir à acquérir un lock sur chaque accès au dictionnaire. Si les accès sont fréquents, vous perdez pratiquement tout avantage de performance que le multi-thread peut vous procurer. Une stratégie de caching local par thread serait à considérer pour minimiser les accès concurrents.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Ya le ConcurrentDictionnary en .Net 4, avec une gestion optimisée des locks...

    Perso je choisirai la solution 1, après tout dépend le volume d'accès concurrentiel, on peut avoir un ordre d'idée ? Des tests de simulation avec création de X threads représentant les mouvements/chats/autres actions peut aussi s'avérer être un test intéressant...

    Et sinon, ReaderWriterLockSlim peut être une classe sympa dans ton cas (utilisée par ConcurrentDictionnary si je ne m'abuse). Ce qu'il faut déterminer, c'est le ratio lecture/ecriture dans ton application

  4. #4
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Un dictionnaire .net pourrait rencontrer des problèmes de performance au-delà de 5 millions d'éléments, selon ce message à Stackoverflow.com, parce qu'il devra se mettre à chercher des nouveaux nombres premiers.
    La liste du World atteindrai les 5000 joueurs maximums, donc pas de problème de ce niveau là.

    Citation Envoyé par Arnard Voir le message
    Ya le ConcurrentDictionnary en .Net 4, avec une gestion optimisée des locks...

    Perso je choisirai la solution 1, après tout dépend le volume d'accès concurrentiel, on peut avoir un ordre d'idée ? Des tests de simulation avec création de X threads représentant les mouvements/chats/autres actions peut aussi s'avérer être un test intéressant...

    Et sinon, ReaderWriterLockSlim peut être une classe sympa dans ton cas (utilisée par ConcurrentDictionnary si je ne m'abuse). Ce qu'il faut déterminer, c'est le ratio lecture/ecriture dans ton application
    Ce serait plutôt de l'ordre de :
    10 accès à la liste de personnages de la carte par ms. (Donc dans le cas 1, faire une recherche depuis la liste du World, dans le cas 2, accès direct depuis la liste de la Map)
    1ajout/suppresion par ms. ( Dans le Cas oû les personnages lors de leur changement de carte doivent être switché de liste )

    Pour le ReaderWriterLockSlim, je ne crois pas que ce soit possible car deux threads peuvent ajouter des joueurs dans la liste en même temps.

Discussions similaires

  1. Performances des langages
    Par Lunixinclar dans le forum Langages de programmation
    Réponses: 35
    Dernier message: 29/09/2006, 11h54
  2. l'Union des dictionnaires
    Par aliassaf dans le forum Général Python
    Réponses: 4
    Dernier message: 24/06/2006, 12h59
  3. Performance des Datasets
    Par Nafanga dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/10/2005, 00h49
  4. performances des virtual functions
    Par xxiemeciel dans le forum C++
    Réponses: 2
    Dernier message: 25/07/2005, 17h24
  5. Performance des vertex array
    Par Mathieu.J dans le forum OpenGL
    Réponses: 13
    Dernier message: 25/06/2004, 10h47

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