2010-09-30 7 views

Antwort

30

Bedenken Sie, dass das im Jahr 2008 war - I glaube, dass .NET 4 ist viel schneller für ThreadStatic Felder als .NET 3.5 war. Ich kann mich nicht sicher erinnern, aber Sie könnten Tests durchführen, wenn Sie wollen.

Das heißt, ich bin nicht wirklich von der Testbeschreibung überzeugt - weil es unrealistisch ist. Haben Sie wirklich müssen wiederholt ein Thread-lokales Feld in einer Schleife lesen? Ist es nicht wahrscheinlicher, dass Sie es einmal lesen und dann ein bisschen später in einem anderen Code?

Letztendlich ist die eigentliche Frage, ob einer oder beide dieser Ansätze für Ihre spezielle Anforderung gut genug sind. Ich bevorzuge ThreadLocal<T> zu ThreadStatic nicht aus Leistungsgründen, sondern weil es für eine geeignete Initialisierung ermöglicht - siehe meine article on randomness für ein Beispiel.

+0

Toller Artikel über Zufall, und danke für die Antwort Jon. Ich bin mit ThreadLocal einfach gegangen, weil es im Vergleich zu ThreadStatic viel schlauer (und instance-sicherer) ist. – Mark

+0

@Mark: Genau - es ist viel schöner :) –

20

Sie sagen, dass [ThreadStatic] ist viel leistungsfähiger als Thread.AllocateDataSlot.

Die Implementierung von ThreadLocal<T> (entsprechend Reflektor) hat 16 dedizierte Typen, die nur [ThreadStatic] unter der Abdeckung verwenden. Sobald sie aufgebraucht und nicht freigegeben sind, schaltet TheadLocal<T> auf Thread.AllocateDataSlot um. (Eigentlich scheint es 16^3 Steckplätze pro <T>, sie machen ein sehr lustiges Schema der Schaffung von generischen Typen, um die Steckplätze zu halten)

So denke ich [ThreadStatic] ist der schnellste.

Denken Sie immer daran, auf undichte Abstraktionen zu prüfen und schauen Sie sich die Implementierung an! Überspringen Sie solche Optimierungen nie vorzeitig ;-)

+0

gute Vermutung, ich habe ThreadLocal vs ThreadStatic "Benchmarked" und der Overhead ist ~ x16. Aber wie von Jon in 99,9999999% des Falles bemerkt, ist dies nicht relevant und Sie werden ThreadLocal gegenüber ThreadStatic bevorzugen, weil es benutzerfreundlicher ist. – Pragmateek