Подтвердить что ты не робот

ThreadStatic vs. ThreadLocal <T> Производительность: ускорения или альтернативы?

Недавно я прочитал этот пост о слабой производительности полей, отмеченных ThreadStatic - они, по-видимому, в 60 раз медленнее обычного доступа к полям..NET 4 ThreadLocal <T> выполнить лучше?

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

4b9b3361

Ответ 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] является самым быстрым.

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