gpt4 book ai didi

c# - ConcurrentBag 和 lock(List) 添加或删除哪个更快?

转载 作者:太空狗 更新时间:2023-10-29 22:22:17 26 4
gpt4 key购买 nike

我需要对 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/

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