【发布时间】:2010-09-30 08:56:37
【问题描述】:
我最近阅读了this post about poor performance of fields marked ThreadStatic - 它们显然比正常的现场访问慢 60 倍。 .NET 4 的 ThreadLocal
是否有任何替代方案可以提供高性能线程专用存储?
【问题讨论】:
标签: .net thread-local threadstatic
我最近阅读了this post about poor performance of fields marked ThreadStatic - 它们显然比正常的现场访问慢 60 倍。 .NET 4 的 ThreadLocal
是否有任何替代方案可以提供高性能线程专用存储?
【问题讨论】:
标签: .net thread-local threadstatic
请记住,那是在 2008 年 - 我相信 .NET 4 对于ThreadStatic 字段比 .NET 3.5 快得多。我记不太清了,但如果你愿意,你可以运行测试。
也就是说,我并不真正相信测试描述 - 因为它不切实际。您真的需要在循环中重复读取线程本地字段吗?不是更有可能你会读一次,然后稍后再用不同的代码读一次吗?
归根结底,真正的问题是这两种方法中的任何一种或两种方法的性能是否足以满足您的特定要求。我更喜欢 ThreadLocal<T> 到 ThreadStatic 不是出于性能原因,而是因为它允许进行适当的初始化 - 请参阅我的 article on randomness 示例。
【讨论】:
他们说[ThreadStatic] 比Thread.AllocateDataSlot 性能要好得多。
ThreadLocal<T> 的实现(根据 Reflector 的说法)有 16 种专用类型,只是在封面下使用了[ThreadStatic]。一旦它们用完并且没有被释放,TheadLocal<T> 切换到Thread.AllocateDataSlot。 (实际上每个<T> 似乎有 16^3 个插槽,他们做了一个非常有趣的方案来创建泛型类型来容纳插槽)
所以我猜[ThreadStatic] 是最快的。
请记住始终检查泄漏的抽象并查看实现!永远不要过早地跳过这样的优化;-)
【讨论】: