2010-09-30 3 views
21

Я недавно прочитал this post about poor performance of fields marked ThreadStatic - они, по-видимому, в 60 раз медленнее обычного доступа к полю. Делает ли .NET 4's ThreadLocal < T> лучше?ThreadStatic против ThreadLocal <T> Производительность: ускорения или альтернативы?

Существуют ли альтернативы, предлагающие высокопроизводительное хранилище для конкретных потоков?

ответ

30

Имейте в виду, что это было в 2008 году - I верят, что .NET 4 намного быстрее для полей ThreadStatic, чем .NET 3.5. Я точно не помню, но вы можете запускать тесты, если хотите.

Тем не менее, я не уверен в описании теста, потому что это нереально. Вам нужно действительно нужно многократно читать нить-локальное поле в цикле? Разве это не более вероятно, что вы прочтете его один раз, а затем немного позже в другой части кода?

В конечном счете, реальный вопрос заключается в том, работает ли один или оба этих подхода достаточно хорошо для вашего конкретного требования. Я предпочитаю ThreadLocal<T> по номеру ThreadStatic не по соображениям производительности, а потому, что он позволяет провести соответствующую инициализацию - например, в моем article on randomness.

+0

Отличная статья о случайности и спасибо за ответ Jon. Я закончил работу с ThreadLocal просто потому, что это более умный (и безопасный экземпляр) по сравнению с ThreadStatic. – Mark

+0

@Mark: Точно - это намного приятнее :) –

20

Говорят, что [ThreadStatic] намного более совершенен, чем Thread.AllocateDataSlot.

Реализация ThreadLocal<T> (согласно Reflector) имеет 16 специализированных типов, которые просто используют [ThreadStatic] под обложкой. Как только они используются и не освобождены, TheadLocal<T> переключается на Thread.AllocateDataSlot. (На самом деле это, по-видимому, 16^3 слота на <T>, они делают очень забавную схему создания родовых типов для хранения слотов).

Итак, я думаю, что [ThreadStatic] является самым быстрым.

Помните, что всегда проверяйте наличие протекающих абстракций и смотрите на реализацию! Никогда прежде не допускайте таких оптимизаций ;-)

+0

Догадка, я «сравнил» ThreadLocal с ThreadStatic, а накладные расходы - x16. Но, как заметил Джон в 99.999999% случаев, это не имеет значения, и вы предпочтете ThreadLocal над ThreadStatic, потому что это более удобно. – Pragmateek