ThreadStatic vs. ThreadLocal <T> Производительность: ускорения или альтернативы?
Недавно я прочитал этот пост о слабой производительности полей, отмеченных ThreadStatic - они, по-видимому, в 60 раз медленнее обычного доступа к полям..NET 4 ThreadLocal <T> выполнить лучше?
Существуют ли альтернативы, которые предлагают высокопроизводительное хранилище для конкретных потоков?
Ответы
Ответ 1
Имейте в виду, что это было в 2008 году. Я считаю, что .NET 4 намного быстрее для полей ThreadStatic
, чем .NET 3.5. Я точно не помню, но вы можете запускать тесты, если хотите.
Тем не менее, я не очень уверен в описании теста - потому что это нереально. Вам действительно нужно многократно читать нить-локальное поле в цикле? Не более вероятно, что вы прочтете его один раз, а затем немного позже в другой бит кода?
В конечном счете, реальный вопрос заключается в том, работает ли один или оба этих подхода достаточно хорошо для вашего конкретного требования. Я предпочитаю от ThreadLocal<T>
до ThreadStatic
не по соображениям производительности, а потому, что он позволяет провести соответствующую инициализацию - см. Статью
Ответ 2
Говорят, что [ThreadStatic]
намного более эффективен, чем Thread.AllocateDataSlot
.
Реализация ThreadLocal<T>
(согласно Reflector) имеет 16 выделенных типов, которые просто используют [ThreadStatic]
под обложкой. Как только они будут использованы и не освобождены, TheadLocal<T>
переключится на Thread.AllocateDataSlot
. (На самом деле это, по-видимому, 16 ^ 3 слота за <T>
, они делают очень забавную схему создания родовых типов для хранения слотов)
Итак, я думаю, [ThreadStatic]
является самым быстрым.
Помните, что всегда проверяйте наличие негерметичных абстракций и смотрите на реализацию! Никогда прежде не пропускайте такие оптимизации; -)