2010-09-30 12 views

Odpowiedz

30

Pamiętaj, że to było w 2008 roku - I wierzę w, że .NET 4 jest o wiele szybszy dla pól ThreadStatic niż .NET 3.5. Nie pamiętam tego na pewno, ale jeśli chcesz, możesz uruchomić testy.

To powiedziawszy, nie jestem przekonany do opisu testu - bo to nierealne. Czy musisz naprawdę trzeba wielokrotnie czytać pole wątku lokalnego w pętli? Czy nie jest bardziej prawdopodobne, że przeczytasz go raz, a potem nieco później w innym kawałku kodu?

Ostatecznie, prawdziwe pytanie brzmi, czy jeden lub oba z tych podejść wystarczająco dobrze wykonuje dla określonego wymogu. Wolę od ThreadLocal<T> do ThreadStatic nie ze względu na wydajność, ale dlatego, że pozwala na odpowiednią inicjalizację - zobacz mój przykład article on randomness.

+0

Świetny artykuł na temat losowania, a dzięki za odpowiedź Jon. Kończyłem pracę z ThreadLocal tylko dlatego, że jest mądrzejszy (i bezpieczniejszy pod względem instancji) w porównaniu do ThreadStatic. – Mark

+0

@ Mark: Dokładnie - jest o wiele ładniejszy :) –

20

Mówią, że [ThreadStatic] jest znacznie bardziej wydajnych niż Thread.AllocateDataSlot.

Implementacja ThreadLocal<T> (zgodnie z Reflectorem) ma 16 dedykowanych typów, które po prostu używają [ThreadStatic] pod pokrywą. Gdy zostaną zużyte i nie zostaną uwolnione, TheadLocal<T> przełącza się na Thread.AllocateDataSlot. (W rzeczywistości wydaje się, że jest to 16^3 slotów na <T>, robią bardzo zabawny schemat tworzenia typowych typów do przechowywania okien)

Domyślam się, że [ThreadStatic] jest najszybszy.

Pamiętaj, aby zawsze sprawdzić nieszczelnych abstrakcji i spojrzeć na realizację! Nigdy przedwcześnie nie pomijaj optymalizacji ;-)

+0

dobrze odgadnąć, mam "benchmarked" ThreadLocal vs ThreadStatic i obciążenie jest ~ x16. Ale jak zauważył Jon w 99,999999% przypadków, nie jest to istotne i wolisz ThreadLocal niż ThreadStatic, ponieważ jest bardziej przyjazny dla użytkownika. – Pragmateek