- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要对 List<T>
执行一些线程安全操作.通常我只是简单地使用:
lock(List<T>)
{
List<T>.Add();
List<T>.Remove();
}
我知道还有另一种方法,使用 ConcurrentBag<T>
.但我不知道哪个更快,或者有什么其他区别。
编辑:
有些人只是推荐我使用ConcurrentBag
,因为这样更安全。但我担心这会使我的操作变慢。
我有很多线程需要在 List<T>
中添加或删除对象, 我想知道哪种方式对性能更好。
最佳答案
您只需尝试一下,即可轻松衡量不同方法的性能!这就是我刚刚得到的:
lock list: 2.162sConcurrentBag: 7.264s
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
public class Test
{
public const int NumOfTasks = 4;
public const int Cycles = 1000 * 1000 * 4;
public static void Main()
{
var list = new List<int>();
var bag = new ConcurrentBag<int>();
Profile("lock list", () => { lock (list) list.Add(1); });
Profile("ConcurrentBag", () => bag.Add(1));
}
public static void Profile(string label, Action work)
{
var s = new Stopwatch();
s.Start();
List<Task> tasks = new List<Task>();
for (int i = 0; i < NumOfTasks; ++i)
{
tasks.Add(Task.Factory.StartNew(() =>
{
for (int j = 0; j < Cycles; ++j)
{
work();
}
}));
}
Task.WaitAll(tasks.ToArray());
Console.WriteLine(string.Format("{0}: {1:F3}s", label, s.Elapsed.TotalSeconds));
}
}
关于c# - ConcurrentBag<T> 和 lock(List<T>) 添加或删除哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29307035/
我一直在阅读新的并发集合,特别是 ConcurrentBag 引起了我的注意。由于 ConcurrentBag 内部在每个单独的线程上持有一个本地集,使用它来跟踪项目,这意味着当线程本身超出范围时,它
"ConcurrentBag(T) is a thread-safe bag implementation, optimized for scenarios where the same thread
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Possible memoryleak in ConcurrentBag? 我的应用中出现严重内存泄漏。我使
我正在运行一些使用 ConcurrentBags 的代码。我正在探索 IEnumerable 功能。我运行的代码是 ConcurrentBag bag = new ConcurrentBag(); T
.NET 4.5.1 我有一个包含 200,000 个对象的 ConcurrentBag。一个对象被两个 long 类型的属性认为是“唯一的”。 我需要检查包中是否存在以前存在的唯一对象,如果不存在,
我有一个 .NET 4.5 单实例 WCF 服务,它维护列表中的项目集合,该列表将同时具有并发的读者和作者,但读者比作者多得多。 我目前正在决定是否使用 BCL ConcurrentBag或使用我自己
有没有办法一次将多个项目添加到 ConcurrentBag,而不是一次添加一个?我没有在 ConcurrentBag 上看到 AddRange() 方法,但是有一个 Concat()。但是,这对我不起
我已经在这里阅读了之前关于 ConcurrentBag 的问题但没有找到在多线程中的实际实现示例。 ConcurrentBag is a thread-safe bag implementation,
分析后,我发现我的应用程序中的特定对象将通过使用对象池而不是构造对象池而受益匪浅。此应用程序基于具有多个线程的生产者/消费者队列。 ConcurrentBag 集合基本上是一个对象池,作为应用程序对象
我在使用包含非托管对象的 ConcurrentBag 正确处理 Dispose/Finalization 时遇到问题。运行下面的代码(通常)会在对 TryTake(). 大概在这种情况下,垃圾收集器在
我需要将 ConcurrentBag 设置为可通知的。我需要知道它安全吗?该类的代码是 public class NotifiableConcurrentBag : ConcurrentBag, IN
我有一个静态集合,比如调用远程 rest api 的任务: static ConcurrentBag> _collection = new ConcurrentBag>(); static void
我读到要修改或改变并发包中的对象,我必须将其取出、修改,然后再放回去。 但是,我看到了执行以下操作的代码: var obj = bag.FirstOrDefault(report => report.
当线程添加或删除 ConcurrentBag 的元素时会发生什么而另一个线程正在枚举这个包?新元素是否也会出现在枚举中,删除的元素是否不会出现? 最佳答案 一 jar read the fine ma
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Possible memoryleak in ConcurrentBag? 编辑1: 真正的问题是。你能证实
我已经构建了这段代码来并行处理大量字符串之间的字符串比较,以加快速度。 我使用了 ConcurrentBag,因此所有线程(任务)都可以写入线程安全集合。然后我将这个集合转储到一个文件中。 我遇到的问
我有一个应用程序,它有一个存储在 static ConcurrentBag 中的对象列表。 UI 有一个计时器,它运行的方法可以更新 ConcurrentBag 中的对象。 只有一个线程(由计时器启动
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T
如何清除ConcurrentBag?它没有任何方法,如 Clear 或 RemoveAll... 最佳答案 2017 年 10 月 3 日更新:正如@Lou 正确指出的那样,赋值是原子的。在这种情况下
我是一名优秀的程序员,十分优秀!