gpt4 book ai didi

c# - ConcurrentBag 与 List 的性能比较

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:30 26 4
gpt4 key购买 nike

前言:我问这个只是因为我没有环境(足够大的数据集+计算能力)以可靠的方式对其进行测试。

问题:给定一个 ConcurrentBag<T> ,加载了数十亿个项目,由单个线程访问/使用,它的性能是否类似于 List<T> ?换句话说,就是对 ConcurrentBag<T> 的枚举。比 List<T> 表现得更好或更差?

最佳答案

ConcurrentBag<T>性能将不可避免地低于 List<T> .虽然您只能从单个线程访问它,但该结构仍然需要有适当的机制来防止出现并发访问时出现竞争危险的可能性。

如果您要在开始枚举之前从单个线程加载集合,则可以使用 ConcurrentBag(IEnumerable<T>) 来避免性能开销。构造函数,而不是通过其 Add 单独添加每个项目方法。

ConcurrentBag<T>为枚举提供“即时快照”语义;见其备注 GetEnumerator 方法。当您访问 ConcurrentBag<T>来自foreach循环,它将首先将其全部内容复制到一个普通的 List<T> 中,然后枚举。每次在循环中使用它时,都会产生大量的性能开销(计算和内存方面)。

如果您的场景是您的列表将由多个线程填充,但随后仅由一个线程读取,那么您应该将其转换为 List<T>一旦作者完成。

关于c# - ConcurrentBag 与 List 的性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com