【问题标题】:ThreadStatic vs. ThreadLocal<T> Performance: speedups or alternatives?ThreadStatic 与 ThreadLocal<T> 性能:加速还是替代方案?
【发布时间】:2010-09-30 08:56:37
【问题描述】:

我最近阅读了this post about poor performance of fields marked ThreadStatic - 它们显然比正常的现场访问慢 60 倍。 .NET 4 的 ThreadLocal 性能更好吗?

是否有任何替代方案可以提供高性能线程专用存储?

【问题讨论】:

    标签: .net thread-local threadstatic


    【解决方案1】:

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

    也就是说,我并不真正相信测试描述 - 因为它不切实际。您真的需要在循环中重复读取线程本地字段吗?不是更有可能你会读一次,然后稍后再用不同的代码读一次吗?

    归根结底,真正的问题是这两种方法中的任何一种或两种方法的性能是否足以满足您的特定要求。我更喜欢 ThreadLocal&lt;T&gt;ThreadStatic 不是出于性能原因,而是因为它允许进行适当的初始化 - 请参阅我的 article on randomness 示例。

    【讨论】:

    • 关于随机的好文章,感谢乔恩的回答。我最终选择了 ThreadLocal,因为它比 ThreadStatic 更智能(并且实例安全)。
    • A ThreadLocal 需要对每个线程进行 Dispose() 调用,这会导致其值被初始化。如果要对资源进行垃圾收集并避免内存泄漏,这是必要的。记住在每个线程中为线程可能使用的所有可能的 ThreadLocals 添加这个 Dispose() 调用是具有挑战性的。在池线程中使用 Dispose() 是一场噩梦(不要尝试!)另外,查看 ThreadLocal 的 MS 参考源,它实际上创建了一个 ThreadStatic 表(每个线程),其中包含代码中任何地方使用的所有 ThreadLocals,这似乎效率低下对于许多 ThreadLocals。
    【解决方案2】:

    他们说[ThreadStatic]Thread.AllocateDataSlot 性能要好得多。

    ThreadLocal&lt;T&gt; 的实现(根据 Reflector 的说法)有 16 种专用类型,只是在封面下使用了[ThreadStatic]。一旦它们用完并且没有被释放,TheadLocal&lt;T&gt; 切换到Thread.AllocateDataSlot。 (实际上每个&lt;T&gt; 似乎有 16^3 个插槽,他们做了一个非常有趣的方案来创建泛型类型来容纳插槽)

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

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

    【讨论】:

    • 好猜,我已经对 ThreadLocal 与 ThreadStatic 进行了“基准测试”,开销约为 x16。但正如 Jon 在 99.999999% 的案例中所注意到的,这并不相关,您会更喜欢 ThreadLocal 而不是 ThreadStatic,因为它对用户更友好。
    猜你喜欢
    • 2013-08-22
    • 2016-08-28
    • 1970-01-01
    • 2011-05-24
    • 2020-11-10
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多