我最近阅读this post about poor performance of fields marked ThreadStatic - 它们显然比正常访问速度慢了60倍。 .NET 4的ThreadLocal < T>表现更好吗?ThreadStatic与ThreadLocal <T>性能:加速或替代?
是否有任何提供高性能线程专有存储的替代方案?
我最近阅读this post about poor performance of fields marked ThreadStatic - 它们显然比正常访问速度慢了60倍。 .NET 4的ThreadLocal < T>表现更好吗?ThreadStatic与ThreadLocal <T>性能:加速或替代?
是否有任何提供高性能线程专有存储的替代方案?
请记住,这是在2008年 - 我相信 .NET 4比NET 3.5 3.5是更快的ThreadStatic
字段。我不记得,但是如果你愿意,你可以运行测试。
这就是说,我没有真正相信测试描述 - 因为这是不现实的。你真的需要反复读取循环中的线程本地字段吗?是不是更有可能你会读一遍,然后稍后再读一遍不同的代码?
最终,真正的问题是这些方法中的任何一种或两种对于您的特定需求是否表现良好。我更喜欢ThreadLocal<T>
到ThreadStatic
不是出于性能的原因,而是因为它允许进行适当的初始化 - 例如,请参阅我的article on randomness。
他们说[ThreadStatic]
比Thread.AllocateDataSlot
更高效。
ThreadLocal<T>
(根据Reflector)的实现有16个专用类型,只使用[ThreadStatic]
在封面下。一旦它们用完并没有释放,TheadLocal<T>
切换到Thread.AllocateDataSlot
。 (实际上它似乎是每个<T>
的16^3个插槽,他们做一个非常有趣的方案来创建通用类型来容纳插槽)
所以我猜[ThreadStatic]
是最快的。
请记住总是检查泄漏的抽象并查看实现!永远不要过早跳过这样的优化;-)
不错的猜测,我已经“基准”了ThreadLocal与ThreadStatic,开销是〜x16。但正如在99.999999%的案例中所指出的那样,这种情况并不相关,并且您比ThreadStatic更喜欢ThreadLocal,因为它更加用户友好。 – Pragmateek 2013-11-01 12:45:26
伟大的文章随机,并感谢您的答案乔恩。我最终只用了ThreadLocal,因为它比ThreadStatic更聪明(和实例安全)。 – Mark 2010-10-01 13:32:43
@Mark:确切地说 - 它好多了:) – 2010-10-01 13:38:34