我需要对 List<T>
执行一些线程安全操作.通常我只是简单地使用:
lock(List<T>)
{
List<T>.Add();
List<T>.Remove();
}
我知道还有另一种方法,使用 ConcurrentBag<T>
.但我不知道哪个更快,或者有什么其他区别。
编辑:
有些人只是推荐我使用ConcurrentBag
,因为这样更安全。但我担心这会使我的操作变慢。
我有很多线程需要在 List<T>
中添加或删除对象, 我想知道哪种方式对性能更好。
最佳答案
您只需尝试一下,即可轻松衡量不同方法的性能!这就是我刚刚得到的:
lock list: 2.162s ConcurrentBag: 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/