我最近阅读this post about poor performance of fields marked ThreadStatic - 它们显然比普通的现场访问慢60倍。 .NET 4的ThreadLocal< T>表现更好吗?
是否存在提供高性能线程专用存储的替代方案?
答案 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]
是最快的。
请记住始终检查泄漏的抽象并查看实现!永远不要过早地跳过这样的优化; - )