Frage ThreadStatic vs. ThreadLocal Performance: Beschleunigungen oder Alternativen?


Ich habe kürzlich gelesen Dieser Post über schlechte Leistung von Feldern markiert ThreadStatic - Sie sind anscheinend 60x langsamer als normaler Feldzugriff. Ist .NET 4s ThreadLocal <T> besser?

Gibt es Alternativen, die hochleistungsfähigen Thread-spezifischen Speicher bieten?


21
2017-09-30 08:56


Ursprung


Antworten:


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

Allerdings bin ich von der Testbeschreibung nicht wirklich überzeugt - weil das unrealistisch ist. Machst du Ja wirklich muss ein thread-lokales Feld in einer Schleife wiederholt gelesen werden? 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 Performance-Gründen, sondern weil es eine entsprechende Initialisierung ermöglicht - siehe mein Artikel über Zufälligkeit zum Beispiel.


30
2017-09-30 09:03



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

Die Implementierung von ThreadLocal<T> (nach Reflector) hat 16 dedizierte Typen, die nur verwendet werden [ThreadStatic] unter dem Schutz. Sobald sie aufgebraucht und nicht befreit sind, TheadLocal<T> schaltet um auf Thread.AllocateDataSlot. (Eigentlich scheint es 16 ^ 3 Slots pro <T>machen sie ein sehr lustiges Schema zum Erstellen generischer Typen, um die Slots zu halten.

Also denke ich [ThreadStatic] ist der schnellste.

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


21
2017-10-03 13:02