La Performance de Contrefil.Incrément
Est Interlocked.Increment(ref x)
plus rapide ou plus lent que x++
pour ints et longs sur les différentes plateformes?
- Comme l'autre, ce n'est pas la même chose. Cela dit, selon msdn.microsoft.com/en-us/magazine/cc163726.aspx un Contrefil.Incrément prend un peu de 14nS (ou environ 71'000'000 par seconde), donc je ne vous inquiétez pas trop à propos de la performance
- Interloqué.L'incrément est destiné à être utilisé dans des environnements de threads
Vous devez vous connecter pour publier un commentaire.
Il est plus lent, car il force l'action de se produire de manière atomique et il agit comme une barrière de mémoire, en éliminant le processeur, la capacité de commander à nouveau accès à la mémoire autour de l'instruction.
Vous devriez être en utilisant Interloqué.Incrément lorsque vous souhaitez que l'action atomique de l'état qui peuvent être partagées entre les threads - il n'est pas destiné à être un remplacement complet pour x++.
Dans notre expérience, les InterlockedIncrement() et al sur Windows sont assez importantes conséquences. Dans le cas d'un échantillon de cas, nous avons été en mesure d'éliminer le dispositif de verrouillage et d'utilisation ++/-- au lieu de cela. À elle seule, cette réduction de temps d'exécution à partir de 140 secondes à 110 secondes. Mon analyse est que le dispositif de verrouillage des forces de mémoire aller-retour (sinon, comment pourrait-autres carottes de le voir?). Un cache L1 de lecture/écriture est d'environ 10 cycles d'horloge, mais une mémoire en lecture/écriture, plus de 100.
Dans ce cas d'exemple, j'ai estimé le nombre d'incrémenter/décrémenter les opérations à environ 1 milliard de dollars. Ainsi, sur un PROCESSEUR 2 ghz c'est quelque chose comme 5 secondes pour que le ++/--, et 50 secondes pour que le dispositif de verrouillage. La propagation de la différence à travers plusieurs threads, et ses près de 30 secondes.
Pensez-y un instant, et vous vous rendrez compte un
Increment
l'appel ne peut pas être plus rapide qu'une simple application de l'opérateur d'incrémentation. Si c'était le cas, alors le compilateur de la mise en œuvre de l'opérateur d'incrémentation appelleraisIncrement
en interne, et qu'ils auraient à effectuer la même.Mais, comme vous pouvez le voir en testant pour vous-même, ils n'effectuent pas le même.
Les deux options ont des finalités différentes. Utiliser l'opérateur d'incrémentation en général. Utilisation
Increment
lorsque vous avez besoin de l'opération atomique et que vous êtes sûr que tous les autres utilisateurs de cette variable sont également en utilisant des opérations verrouillées. (S'ils ne sont pas tous les de coopérer, il n'a pas vraiment l'aider.)C'est plus lent. Cependant, c'est le plus performant de façon générale, je sais que pour la réalisation de la sécurité des threads sur les variables scalaires.
volatile
est plus performant sur les scalaires, mais a l'inconvénient de nécessiter des bonnes pratiques de codage pour être bien utilisé.++
est toujours ce n'est pas atomique / pas thread-safe, alors que lesInterlocked.Increment
(ou unlock
et++
) est thread-safe. En outre,volatile
est inutile avec soit de la validité de la thread-safe méthodes..Il sera toujours plus lent car il doit effectuer un bus de l'unité centrale de verrouillage vs juste la mise à jour d'un registre. Cependant, les Processeurs modernes atteindre près registre de la performance il est donc négligeable, même dans le traitement en temps réel.
Ma performance test:
volatile: 65,174,400
de verrouillage: 62,428,600
contrefil: 113,248,900
VolatileRead
etVolatileWrite
de cette manière vous laisser ouvert à la même race condition quelock
etInterlocked.Increment
éviter?