ThreadStatic与ThreadLocal <t>性能:加速或替代?</t>

时间:2010-09-30 08:56:37

标签: .net thread-local threadstatic

我最近阅读this post about poor performance of fields marked ThreadStatic - 它们显然比普通的现场访问慢60倍。 .NET 4的ThreadLocal&lt; T>表现更好吗?

是否存在提供高性能线程专用存储的替代方案?

2 个答案:

答案 0 :(得分:30)

请记住,那是在2008年 - 我相信对于ThreadStatic字段,.NET 4比.NET 3.5快得多。我无法确定,但如果你愿意,你可以运行测试。

那就是说,我对测试描述并不是很有信心 - 因为这是不现实的。你真的需要重复读取循环中的线程局部字段吗?您是否更有可能一次读取它,然后稍后再用不同的代码读取它?

最终,真正的问题是这些方法中的一个或两个是否足以满足您的特定要求。我更喜欢ThreadLocal<T>ThreadStatic,不是出于性能原因,而是因为它允许适当的初始化 - 请参阅我的article on randomness以获取示例。

答案 1 :(得分:22)

他们说[ThreadStatic]Thread.AllocateDataSlot更高效。

ThreadLocal<T>(根据Reflector)的实现有16种专用类型,只使用封面下的[ThreadStatic]。一旦用完且未释放,TheadLocal<T>会切换到Thread.AllocateDataSlot。 (实际上它似乎是每<T> 16 ^ 3个插槽,他们做了一个非常有趣的方法来创建通用类型来保存插槽)

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

请记住始终检查泄漏的抽象并查看实现!永远不要过早地跳过这样的优化; - )