2010-02-05 6 views
3

Quel serait le moyen le plus efficace de stocker un ensemble de valeurs dans une session? Je devine que c'est soit une liste/tableau ou un dictionnaire. Fondamentalement, lorsqu'un utilisateur sélectionne un élément d'une DropDownList, une valeur (between 1 and N where N <= 20) est renvoyée au serveur. Je voudrais alors que cette valeur soit utilisée comme index (si vous utilisez des tableaux) ou comme clé (si vous utilisez un dictionnaire) dans la session. Je ne veux pas que la valeur soit vue par l'utilisateur, d'où la raison pour laquelle il n'est pas stocké dans le DDL. D'après ce que je comprends, les dictionnaires sont conçus pour les recherches de clés. Cependant, puisque l'échelle est assez petite, y a-t-il des frais généraux d'utilisation d'un dictionnaire qui pourrait le rendre moins efficace dans ce cas? Chaque valeur correspondante est unique à l'utilisateur, j'ai donc décidé d'utiliser des sessions.Tableau, Dictionnaire ou Liste dans une session?

Merci pour tout conseil

+3

De combien d'utilisateurs simultanés parle-t-on? Si ce n'est pas des milliers, probablement une micro-optimisation ... –

+0

@Mitch - Les problèmes de sécurité des threads diffèrent entre eux, mais j'espère que quelqu'un y répondra aussi –

+0

Il y a des heures de pointe où 1000-2000 sont attendus simultanément. Habituellement, il y en a quelques centaines simultanément. Devrai-je gérer les problèmes de threading avec cette méthode? – Skoder

Répondre

2

Les tableaux seraient la meilleure option pour vous ici.

Le dictionnaire pourrait être plus évolutif si vous avez l'intention d'ajouter un peu plus de type personnalisé avec un minimum de changements de code. Récupérer un élément du dictionnaire est généralement une opération de 1 saut. Mais le seul surcoût impliqué dans l'utilisation de Dictionary est la sérialisation. La sérialisation ne sera impliquée que lorsque vous utiliserez SQLServer ou StateServer pour stocker vos sessions.

J'ai fait un benchmarking où j'ai utilisé BinaryFormatter pour sérialiser un tableau de int, List et un dictionnaire.

J'ai sérialisé chaque objet 100000 fois. Chaque structure de données contient 20 valeurs. Voici les résultats:

int[] took 1955 ms to serialize 
List<int> took 4135 ms to serialize 
Dictionary<int,int> took 27917ms to serialize 

Soyez donc prudent lorsque vous utilisez le dictionnaire quand sérialisation est impliqué.

=================================== Pour étayer mon argument selon lequel Récupérer un élément du dictionnaire est discret, efficace, j'ai aussi fait un benchmarking où j'ai stocké 20 éléments dans chaque structure de données (que j'ai utilisé ci-dessus) et récupéré des éléments pour 10000000 fois. Voici les résultats

int[] took 136 ms to serialize 
List<int> took 184 ms to serialize 
Dictionary<int,int> took 877 ms to serialize 

Bien sûr un peu plus lent que les deux autres, mais il fournit plus d'évolutivité, puis les deux autres structure de données.

Mais s'il s'agit d'un nombre fixe d'éléments, optez pour les tableaux. Ils sont les plus efficaces dans ce cas.

+0

Merci pour la réponse! Y a-t-il des problèmes de threading dont je devrais m'inquiéter? – Skoder

+0

Vous utiliseriez une session, vous n'avez donc pas à vous soucier des discussions. Les fournisseurs de sessions s'occupent du verrouillage. Mais si vous utilisez des variables globales ou statiques, vous devez faire attention. – ata

+0

Aucune variable globale et la seule variable statique est ma classe de journalisation. Merci pour l'aide. – Skoder

0

Presque certainement un micro-optimisation, mais sera très probablement la meilleure performance absolue de tableaux. Votre meilleur pari est d'essayer toutes vos options et de valider empiriquement.

Questions connexes