est la File d'attente.Synchronisé plus rapide que l'utilisation d'un Verrou()?
J'ai une File d'attente à laquelle la mise en File d'attente de l'opération serait effectuée par un thread et Dequeue serait effectuée par un autre. Inutile de dire que j'ai eu à mettre en œuvre du fil de sécurité.
J'ai d'abord essayé à l'aide d'un verrou sur la file d'attente avant chaque mise en File/file d'attente qui donne un meilleur contrôle pour le mécanisme de verrouillage. Il a bien fonctionné, mais mon esprit curieux m'a amené à tester un peu plus.
J'ai ensuite essayé d'utiliser la File d'attente.Synchronisé wrapper en gardant tout de même. Maintenant, je ne suis pas sûr si c'est vrai, mais les performances ne semblent un tantinet plus rapide avec cette approche.
Pensez-vous, il y a réellement une différence de performance entre les deux, ou je suis juste en imaginant les choses ici..? 🙂
OriginalL'auteur Danish Khan | 2011-01-27
Vous devez vous connecter pour publier un commentaire.
Lors de la demande de
Queue.Synchonized
vous obtenez unSynchronizedQueue
en retour qui utilise unlock
très peu autour des appels àEnqueue
etDequeue
sur l'intérieure de la file d'attente. Par conséquent, la performance devrait être la même que l'utilisation d'unQueue
et de la gestion de verrouillage-vous pourEnqueue
etDequeue
avec votre proprelock
.Vous êtes en effet imaginer des choses - qu'ils doivent être la même.
Mise à jour
Il est d'ailleurs le fait que lors de l'utilisation d'un
SynchronizedQueue
vous ajoutez une couche d'indirection que vous devez passer par le wrapper méthodes pour obtenir à l'intérieur de la file d'attente dont il est le directeur. Si quelque chose de ce qui devrait ralentir les choses très très légèrement plus que vous avez une trame supplémentaire sur la pile qui doit être géré pour chaque appel. Dieu sait si dans-doublure annule ce sort bien. C'est là minimale.Mise à jour 2
J'ai maintenant comparé à cela, et comme prévu dans ma précédente mise à jour:
J'ai réalisé un single-threaded test comme ils utilisent la même technique de verrouillage (c'est à dire
lock
) donc, les tests pur frais généraux dans une "ligne droite" semble raisonnable.Ma référence produit les résultats suivants pour un Libération construire:
En utilisant le code suivant:
Je fais l'hypothèse que l'OP est à l'aide de verrouillage à peu autour de
Enqueue
etDequeue
des appels, mais je vois votre point de vue. J'ai expliqué dans ma réponse.merci pour l'investissement de temps et d'efforts dans l'obtention d'une autorité réponse à ce problème. Bravo à vous.
Comment les valeurs dans les tests ci-dessus de les comparer à l'aide d'un ConcurrentQueue?
OriginalL'auteur Tim Lloyd
Nous ne pouvons pas répondre à cette question. Vous seul pouvez répondre par vous-même par l'obtention d'un générateur de profils et de tester à la fois les scénarios (
Queue.Synchronized
vsLock
) sur les données du monde réel à partir de votre application. Il pourrait même ne pas être un goulot d'étranglement dans votre application.Cela dit, vous devriez probablement juste être à l'aide de
ConcurrentQueue
.Découvrez Rx. Il a un rétroportage de
ConcurrentQueue<T>
pour .NET 3.5.C'est que la version de
ConcurrentQueue<T>
fait généralement plus rapide? J'ai vu que des conseils à quelques reprises, mais aucun des chiffres de performance. Tous les chiffres?Demandez-vous si c'est aussi rapide que la
ConcurrentQueue<T>
.NET 4.0, ou si c'est plus rapide qu'une plaine de vanilleQueue<T>
gardé parlock
déclarations? Dans le premier cas, je ne sais pas. Dans ce dernier cas, il dépend du niveau de contention (avec peu ou pas de contention,Queue<T>
avec des serrures est meilleur, comme potentiel de conflit augmente, la version simultanée conduit de plus en plus). Je pourrais sans doute creuser quelques chiffres quelque part si vous le souhaitez.Mon point principal est que je sais qu'il existe une version en Rx (3.5), mais je devine que ce n'est pas le version qui est dans .Net 4.0.
OriginalL'auteur jason
OriginalL'auteur Vishal Patwardhan