我最近阅读了这篇关于标记为 ThreadStatic 的字段性能不佳的帖子——它们显然比正常的字段访问慢 60 倍。.NET 4 的 ThreadLocal< T > 性能更好吗?
有没有提供高性能线程特定存储的替代方案?
我最近阅读了这篇关于标记为 ThreadStatic 的字段性能不佳的帖子——它们显然比正常的字段访问慢 60 倍。.NET 4 的 ThreadLocal< T > 性能更好吗?
有没有提供高性能线程特定存储的替代方案?
请记住,那是在 2008 年——我相信.NET 4ThreadStatic
比 .NET 3.5 快得多。我不记得了,但如果你愿意,你可以运行测试。
也就是说,我并不真正相信测试描述 - 因为它不切实际。您真的需要在循环中重复读取线程本地字段吗?不是更有可能你会读一次,然后稍后再用不同的代码读一次吗?
最终,真正的问题是这两种方法中的任何一种或两种方法的性能是否足以满足您的特定要求。我更喜欢ThreadLocal<T>
不是ThreadStatic
出于性能原因,而是因为它允许进行适当的初始化 - 例如,请参阅我关于随机性的文章。
他们说这[ThreadStatic]
比Thread.AllocateDataSlot
.
ThreadLocal<T>
(根据 Reflector)的实现有 16 种专用类型,它们只是[ThreadStatic]
在封面下使用。一旦它们用完并且没有被释放,TheadLocal<T>
就切换到Thread.AllocateDataSlot
. (实际上它似乎是 16^3 个插槽<T>
,他们做了一个非常有趣的方案来创建泛型类型来保存插槽)
所以我猜[ThreadStatic]
是最快的。
请记住始终检查泄漏的抽象并查看实现!永远不要过早地跳过这样的优化;-)