2010-09-30 29 views

回答

30

請記住,這是在2008年 - 我相信 .NET 4比NET 3.5 3.5是更快的ThreadStatic字段。我不記得,但是如果你願意,你可以運行測試。

這就是說,我沒有真正相信測試描述 - 因爲這是不現實的。你真的需要反覆讀取循環中的線程本地字段嗎?是不是更有可能你會讀一遍,然後稍後再讀一遍不同的代碼?

最終,真正的問題是這些方法中的任何一種或兩種對於您的特定需求是否表現良好。我更喜歡ThreadLocal<T>ThreadStatic不是出於性能的原因,而是因爲它允許進行適當的初始化 - 例如,請參閱我的article on randomness

+0

偉大的文章隨機,並感謝您的答案喬恩。我最終只用了ThreadLocal,因爲它比ThreadStatic更聰明(和實例安全)。 – Mark 2010-10-01 13:32:43

+0

@Mark:確切地說 - 它好多了:) – 2010-10-01 13:38:34

20

他們說[ThreadStatic]Thread.AllocateDataSlot更高效。

ThreadLocal<T>(根據Reflector)的實現有16個專用類型,只使用[ThreadStatic]在封面下。一旦它們用完並沒有釋放,TheadLocal<T>切換到Thread.AllocateDataSlot。 (實際上它似乎是每個<T>的16^3個插槽,他們做一個非常有趣的方案來創建通用類型來容納插槽)

所以我猜[ThreadStatic]是最快的。

請記住總是檢查泄漏的抽象並查看實現!永遠不要過早跳過這樣的優化;-)

+0

不錯的猜測,我已經「基準」了ThreadLocal與ThreadStatic,開銷是〜x16。但正如在99.999999%的案例中所指出的那樣,這種情況並不相關,並且您比ThreadStatic更喜歡ThreadLocal,因爲它更加用戶友好。 – Pragmateek 2013-11-01 12:45:26